java+struts2防盗链(filter不可过滤action)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“四种filter过滤器”。
Java+struts2防盗链 Author:Rose(wangjiaoe)Time:20101028
前段时间使用到了防盗链,使用时用的是过滤器filter,其中遇到了问题,最后对action无法过滤问题得到了解决,这儿写个小笔记记录一下。
防盗链: 解释一下什么是防盗链:就是防止在没有通过合理的登陆界面,直接进入到系统中.
优点:避免在每个页面判断是否获得seion,虽然在里也是判断是否或的seion,但是代码简单,重用性高.
1步:建立一个类实现Filter package com.l99.filter;
import java.io.IOException;
import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSeion;/**
* 实现filter()
*
* @author filter
*
*/
public cla LoginFilter implements Filter {
HttpSeion seion =((HttpServletRequest)request).getSeion();System.out.println(seion.getAttribute(“userInfo”));//测试用 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException { public void destroy(){ } // TODO Auto-generated method stub
}
{ } } //测试用,获取请求的地址System.out.println(((HttpServletRequest)request).getRequestURI();//如果是登录就放行
if(“/RightManage/login.jsp”.equals(((HttpServletRequest)request).getRequestURI()))// 放行
chain.doFilter(request, response);} else {
if(seion.getAttribute(“userInfo”)== null){ // 重定向到登录界面,或提示没有权限
((HttpServletResponse)response).sendRedirect(“/login.jsp”);} } public void init(FilterConfig filterConfig)throws ServletException // TODO Auto-generated method stub
2.配置XML:
loginFilter
com.l99.filter.LoginFilter//文件全路径
//下面是你要防盗的页面,可以有多个或一个,因为在大型项目中,jsp页面分类会很细,可能装载在不同的文件夹所以可以有多对
loginFilter
*.jsp
loginFilter
/form/cfa/* //过滤在form文件夹下,cfa子文件夹中的jsp页面
注释:测试就实现了简单的登录过滤
二:加入struts2 ,对action进入过滤
注意:Filter好像只可以过滤jsp,不可以过滤action,过滤action最好用拦截器 1.XML 配置
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
2.创建拦截器类,实现Interceptor
package com.l99.web.right.interceptor;
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSeion;
import org.apache.struts2.ServletActionContext;
import com.l99.right.ManageUserInfo;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;/**
* 登录、权限拦截器,实现interceptor
* @author Owner
*
*/
public cla LoginInterceptor implements Interceptor{ public void destroy(){
} // TODO Auto-generated method stub
public void init(){ } /**
* 拦截器
*/
public String intercept(ActionInvocation invocation)throws
//获取uri
//获取request
ActionContext context = invocation.getInvocationContext();HttpServletRequest request = //获取seion
HttpSeion seion = request.getSeion();//获取请求的路径
String path = request.getRequestURI();//判断是否登录,如果登录判断是否有访问的权限
if(seion.getAttribute(“userInfo”)== null){ // 重定向到登录界面
//request.getRequestDispatcher(“/login.jsp”);此方式用下面的 // TODO Auto-generated method stub
Exception {(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);Action.LOGIN;代替
return Action.LOGIN;
}
} }else{
} return invocation.invoke();//判断访问的是否是 需要指定的权限的用户
if(path.contains(“/sysFun/right.action”)){
} ManageUserInfo userInfo =(ManageUserInfo)if(!“超级管理员”.equals(userInfo.getRoleName())){ } request.setAttribute(“error”, “对不起,您没有访问权限”);return Action.ERROR;seion.getAttribute(“userInfo”);
3.struts.xml配置
cla=“com.l99.web.right.interceptor.LoginInterceptor”>
Hello world
-->
/WEB-INF/pages/error.jsp /login.jsp
/WEB-INF/pages/manage_sysfun/right.jsp
“com.l99.web.right.EditManageSysFunAction”>
……………其它action
注意:拦截器类中的return Action.LOGIN;找到的是struts2中struts.xml中的全局变量
/WEB-INF/pages/error.jsp /login.jsp
中的name=login,返回到相应的地方,这儿是登录界面/login.jsp
到这儿就完成了!
前几天写了个filter,配置后过滤不了action请求。
在网上查看了资料,看了下struts2的源码,发现struts在FilterDispatcher中调用action。因此,在配置filter的时候一定要将自定义的filter放在FilterDisafcher前面。这样就可以过滤action请求了,不然action都执行完了在调用自定义的filter,肯定过滤不了action啦。filter执行顺序跟配置的先后有关,先配置的先执行