`
hm4123660
  • 浏览: 279287 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:69249
社区版块
存档分类
最新评论

过滤器和拦截器的比较及未登录用户权限限制的实现

阅读更多

需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。

过程:因为对过滤器和拦截器都不熟悉,开始两种方式都问题不断,后调试通过,贴在这里留作小结和备忘

 

过滤器filter实现

配置:web.xml

 

  1. <filter>  
  2.     <filter-name>RightFilter</filter-name>  
  3.     <filter-class>com.***.rights.RightFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>RightFilter</filter-name>  
  7.     <url-pattern>*.jsp</url-pattern>  
  8. </filter-mapping>  
  9. <filter-mapping>  
  10.     <filter-name>RightFilter</filter-name>  
  11.     <url-pattern>*.action</url-pattern>  
  12. </filter-mapping> 

代码:

 

  1. mport java.io.IOException;  
  2.   
  3. import javax.servlet.Filter;  
  4. import javax.servlet.FilterChain;  
  5. import javax.servlet.FilterConfig;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.ServletRequest;  
  8. import javax.servlet.ServletResponse;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12. import javax.servlet.http.HttpSession;  
  13.   
  14. public class RightFilter extends HttpServlet implements Filter {  
  15.   
  16.     public void doFilter(ServletRequest arg0, ServletResponse arg1,  
  17.             FilterChain arg2) throws IOException, ServletException {  
  18.         HttpServletResponse response = (HttpServletResponse) arg1;    
  19.         HttpServletRequest request=(HttpServletRequest)arg0;  
  20.         HttpSession session = request.getSession(true);    
  21.         String usercode = (String) session.getAttribute("usercode");//  
  22.         String url=request.getRequestURI();  
  23.         if(usercode==null || usercode.equals(""))  
  24.         {  
  25.             //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转  
  26.             if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 ))  
  27.             {  
  28.                 response.sendRedirect("登录路径");  
  29.                 return ;  
  30.             }             
  31.         }  
  32.             //已通过验证,用户访问继续  
  33.             arg2.doFilter(arg0, arg1);  
  34.             return;  
  35.     }  
  36.   
  37.     public void init(FilterConfig arg0) throws ServletException {  
  38.         // TODO Auto-generated method stub  
  39.   
  40.     }  

 

 

配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法

跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤

 

 

拦截器interceptor实现:

配置:struts.xml

 

[xhtml] view plaincopy
 
  1. <interceptors>    
  2.             <!--定义一个名为authority的拦截器-->    
  3.             <interceptor  class="com.***.rights.RightInterceptor" name="rightInterceptor"/>    
  4.                 <!--定义一个包含权限检查的拦截器栈-->    
  5.                 <interceptor-stack name="mydefault">    
  6.                 <!--配置内建默认拦截器-->    
  7.                 <interceptor-ref name="defaultStack"/>    
  8.                 <!--配置自定义的拦截器-->    
  9.                 <interceptor-ref name="rightInterceptor"/>    
  10.             </interceptor-stack>    
  11.         </interceptors>    
  12.         <default-interceptor-ref name="mydefault" />    
  13.         <!--定义全局Result-->    
  14.         <global-results>   
  15.             <result name="login">Login.jsp</result>    
  16.             <result name="error">/error.jsp </result>   
  17.         </global-results>           

 

 

代码:

 

[java] view plaincopy
 
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. import com.opensymphony.xwork2.Action;  
  4. import com.opensymphony.xwork2.ActionInvocation;  
  5. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  6. import com.opensymphony.xwork2.ActionContext;  
  7. public class RightInterceptor extends AbstractInterceptor {  
  8.   
  9.     @Override  
  10.     public String intercept(ActionInvocation invocation) throws Exception {  
  11.         //System.out.println("拦截器开始验证");  
  12.         try  
  13.         {  
  14.             ActionContext actionContext = ActionContext.getContext();  
  15.             Map<String,Object> session = actionContext.getSession();  
  16.             String user=session.get("usercode").toString();     
  17.             //当前用户session无效且访问的action不是登录action时,执行拦截,跳转  
  18.             if((user==null || user.equals("")) && !invocation.getAction().getClass().getName().equals("登录action"))   
  19.             {  
  20.                 return Action.LOGIN;  
  21.             }  
  22.         }  
  23.         catch(Exception e)  
  24.         {  
  25.             e.printStackTrace();  
  26.             return Action.LOGIN;  
  27.         }  
  28.         //System.out.println("拦截器通过验证");  
  29.         return invocation.invoke();//执行访问的action  
  30.           
  31.   
  32.     }  
  33.   
  34. }  

 

 

拦截器由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。拦截器截获用户对action的访问,如需要跳转,只需如action一样返回一个result,spring根据result的配置执行跳转。如无需跳转,可调用invocation.invoke();方法来执行用户请求的action。拦截器在action之前开始,在action完成后结束(如被拦截,action根本不执行)

 

 

如不进行处理,过滤器和拦截器都会将正常的登录操作屏蔽,因此过滤器中需要判断用户访问的url是否为登录操作或登录页面,拦截器中需要判断用户访问的action是否登录action。(暂未考虑其他区分方法,留问。)

 

 

具体配置不加说明,网上很多

 

分享到:
评论

相关推荐

    struts2拦截器

    比如在登入一个页面时,如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。这样如果有新增权限的话,不用在Action里修改任何代码,直接在Interceptor里...

    NetLimiter v4.1.6.0.zip

    过滤器编辑 – 创建自定义过滤器以高度适用于自己的网络规则; 计划任务 – 指定自动启用或禁用特定规则「限制、优先级」的时间; 远程管理 – 支持使用 NetLimiter 远程控制其他计算机;用户权限 – 指定哪个用户...

    NetLimiter_v4.1.6.0.7z

    NetLimiter 是专为Windows设计的终极互联网流量控制和监控工具,您可以使用 NetLimiter 为应用程序甚至单个连接设置下载/上传传输速率限制,并监控其互联网流量,除了这一独特功能外,Netlimiter还提供全面的互联网...

    NetLimiter_v4.1.8.0.7z

    NetLimiter 是专为Windows设计的终极互联网流量控制和监控工具,您可以使用 NetLimiter 为应用程序甚至单个连接设置下载/上传传输速率限制,并监控其互联网流量,除了这一独特功能外,Netlimiter还提供全面的互联网...

    NetLimiter v4.1.6.0 网络流量监测控制软件

    NetLimiter 是专为Windows设计的终极互联网流量控制和监控工具,您可以使用 NetLimiter 为应用程序甚至单个连接设置下载/上传传输速率限制,并监控其互联网流量,除了这一独特功能外,Netlimiter还提供全面的互联网...

    spring security 参考手册中文版

    17.4记住我的接口和实现 138 17.4.1 TokenBasedRememberMeServices 138 17.4.2 PersistentTokenBasedRememberMeServices 139 18.跨站点请求伪造(CSRF) 140 18.1 CSRF攻击 140 18.2同步器令牌模式 141 18.3何时使用...

    计算机网络安全问题分析.doc

    堡垒机是近几年新兴的一种网络平安技术,核心理念 是阻断用户对效劳器、网络资源的直接访问,以协议代理的方式接管终端用户的访问需 求,实现核心系统的运维及平安审计两大主要功能。通过一些技术手段监控、收集网络...

    ASP ISchool随机抽题考试系统

    7.抽题后保持抽题结果选择,如选定考题固定,则该用户抽题完成后即使退出重新登录也会保持题目 8.支持练习模式,答题后即可看到答题结果并且可以查错 更新日志: V3.7.1(20130315) 1.修正数个BUG V3.7.0...

    网路岗7.03.35官方原版破解

    Windows XP 和 Windows Me 中的“Internet 连接共享”及许多 Internet 网关设备都使用 NAT,尤其是在通过 DSL 或电缆调制解调器连接宽带网的情况下。 NAT 对于解决 IPv4 地址耗费问题(在 IPv6 部署中却没必要)...

    令人难以置信的StartPage -高效的开始页面。「Incredible StartPage - Productive Start Page」-crx插件

    权限用于搜索适合的图像作为背景已知问题和局限性-某些小书签可能无法在StartPage内运行-如果使用广告拦截器,则可能需要在StartPage中将其禁用(将“ newtab”和“ ncdfeghkpohnalmpblddmnppfooljekh”添加到白名单...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

    易语言 茶凉专用模块

    子程序 窗口禁止, 逻辑型, 公开, 在窗口中允许或禁止所有鼠标及键盘输入(成功返回真,失败返回假) .参数 窗口句柄, 整数型, , 欲禁止鼠标键盘输入的窗口或控件的句柄 .参数 是否禁止, 逻辑型, 可空, 默认为真:禁止 假...

Global site tag (gtag.js) - Google Analytics