java+struts2防盗链(filter不可过滤action)
2010-10-28 10:00
435 查看
Java+struts2
防盗链
Author:Rose(wangjiaoe)
Time:20101028
前段时间使用到了防盗链,使用时用的是过滤器
filter
,其中遇到了问题,最后对
action
无法过滤问题得到了解决,这儿写个小笔记记录一下。
防盗链
:
解释一下什么是防盗链:就是防止在没有通过合理的登陆界面,直接进入到系统中.
优点:避免在每个页面判断是否获得
session
,虽然在里也是判断是否或的
session
,但是代码简单,重用性高.
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.HttpSession; /** * 实现filter () * * @author filter * */ public class LoginFilter implements Filter { public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpSession session = ((HttpServletRequest) request).getSession(); System.out.println(session.getAttribute("userInfo"));//测试用 //测试用,获取请求的地址 System.out.println(((HttpServletRequest)request).getRequestURI(); //如果是登录就放行 if ("/RightManage/login.jsp".equals(((HttpServletRequest) request) .getRequestURI())) // 放行 chain.doFilter(request, response); } else { if (session.getAttribute("userInfo") == null) { // 重定向到登录界面,或提示没有权限 ((HttpServletResponse)response).sendRedirect("/login.jsp"); } } } public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } }
2.
配置XML:
<!-- 防盗链过滤器 --> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.l99.filter.LoginFilter</filter-class>//文件全路径 </filter> //下面是你要防盗的页面,可以有多个或一个,因为在大型项目中,jsp页面分类会很细,可能装载在不同的文件夹所以可以有多对 <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/form/cfa/*</url-pattern> //过滤在form文件夹下,cfa子文件夹中的jsp页面 </filter-mapping>
注释:测试就实现了简单的登录过滤
二:加入
struts2 ,
对
action
进入过滤
注意:
Filter
好像只可以过滤
jsp
,不可以过滤
action
,过滤
action
最好用拦截器
1.
XML
配置
<!-- struts2 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.
创建拦截器类
,实现
Interceptor
package com.l99.web.right.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; 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 class LoginInterceptor implements Interceptor{ public void destroy() { // TODO Auto-generated method stub } public void init() { // TODO Auto-generated method stub } /** * 拦截器 */ public String intercept(ActionInvocation invocation) throws Exception { //获取uri //获取request ActionContext context = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST); //获取session HttpSession session = request.getSession(); //获取请求的路径 String path = request.getRequestURI(); //判断是否登录,如果登录判断是否有访问的权限 if(session.getAttribute("userInfo")== null){ // 重定向到登录界面 //request.getRequestDispatcher("/login.jsp"); 此方式用下面的 Action.LOGIN;代替 return Action.LOGIN; }else{ //判断访问的是否是 需要指定的权限的用户 if(path.contains("/sysFun/right.action")){ ManageUserInfo userInfo = (ManageUserInfo) session.getAttribute("userInfo"); if(!"超级管理员".equals(userInfo.getRoleName())){ request.setAttribute("error", "对不起,您没有访问权限"); return Action.ERROR; } } } return invocation.invoke(); } }
3.
struts.xml
配置
<package name="sysFun" namespace="/sysFun" extends = "struts-default"> <!-- 拦截器 --> <interceptors> <interceptor name="loginInterceptor" class="com.l99.web.right.interceptor.LoginInterceptor"> <param name="hello">Hello world</param> </interceptor> <!-- 拦截器栈 --> <interceptor-stack name="mystack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <!-- struts2默认拦截器 <interceptor-ref name="defaultStack"></interceptor-ref>--> </interceptor-stack> </interceptors> <!--global-results放的位置顺序不对会报错, 全局变量error --> <global-results> <result name="error">/WEB-INF/pages/error.jsp</result> <!-- LoginInterceptor中的Action.LOGIN对应找到name --> <result name="login">/login.jsp</result> </global-results> <action name="right" method="right" class = "com.l99.web.right.EditManageSysFunAction"> <result > /WEB-INF/pages/manage_sysfun/right.jsp </result> <!-- 引用拦截器: 拦截action --> <interceptor-ref name="mystack"></interceptor-ref> </action> ……………其它action </package>
注意:
拦截器类中的
return
Action.
LOGIN
;
找到的是
struts2
中
struts.xml
中的全局变量
<
global-results
>
<
result
name
=
"error"
>
/WEB-INF/pages/error.jsp
</
result
>
<!-- LoginInterceptor
中的
Action.LOGIN
对应找到
name -->
<
result
name
=
"login"
>
/login.jsp
</
result
>
</
global-results
>
中的
name=login
,返回到相应的地方,这儿是登录界面
/login.jsp
到这儿就完成了!
相关文章推荐
- struts2为什么filter不能过滤.action的请求
- 为什么我的Filter不过滤Struts2的Action类型的文件?
- Struts2 web项目自写Filter无法过滤*.action地址
- filter不能过滤struts2中的action
- 10、Action Filter 与 内置的Filter实现(实例-防盗链)
- Java:Struts2之Action基础与配置
- java的文件过滤FileFilter
- [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- asp.net mvc 5 利用ActionFilterAttribute实现权限过滤
- struts2拦截器的方法过滤功能在Action动态方法调用中的应用 .
- JavaEE Filter敏感词过滤的方法实例详解
- java struts2模拟百度百科图片中的防盗链设置
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- 【JAVA学习】struts2的action中使用session的方法
- Struts2 DateTimepicker标签 和 java.lang.RuntimeException: Invalid action class configuration that refer
- java--struts2--action传值到jsp
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- struts2的ActionContextCleanUp filter
- struts2 使filter 过滤某些路径
- ASP.NET MVC 入门9 Action Filter 与 内置的Filter实现(实例-防盗链)