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

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

阅读更多

需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或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。(暂未考虑其他区分方法,留问。)

 

 

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

 

分享到:
评论

相关推荐

    拦截器和过滤器的区别

    在现代软件开发过程中,特别是Web应用程序中,为了实现灵活高效的业务逻辑处理及控制流管理,常常会使用到两种设计模式:拦截器(Interceptor)与过滤器(Filter)。这两种技术虽然在功能上有一定的相似之处,但其...

    Jsp中使用过滤器实现用户权限限制功能

    本文将深入探讨如何在JSP中利用过滤器实现用户权限限制功能。 首先,我们需要了解过滤器的概念。在Servlet规范中,过滤器是Java Web应用中的一个组件,它可以在请求被Servlet处理之前和之后执行一些预处理或后处理...

    过滤器/拦截器

    在Web开发领域,过滤器(Filter)和拦截器(Interceptor)是两种常见的机制,它们用于在请求被实际处理之前或之后执行特定的操作。这两种技术在Java Web应用中尤为常见,尤其是使用Servlet API或者Spring框架的时候...

    struts03:拦截器、过滤器与拦截器的区别、文件上传

    综上所述,拦截器和过滤器在Web开发中各自扮演着重要角色,而文件上传作为常见的业务需求,可以通过Struts2框架中的拦截器机制进行高效且安全的实现。理解它们的工作原理和区别,有助于提高开发效率和代码质量。

    java web权限访问过滤器

    过滤器是Servlet API的一部分,它允许我们在请求到达目标资源(如Servlet、JSP页面)之前或之后对请求和响应进行拦截处理。 首先,我们需要了解过滤器的基本概念。在Java Web中,过滤器是一个实现了javax.servlet....

    通过过滤器管理用户权限(2)

    在本文中,我们将深入探讨如何使用过滤器来管理用户权限,这是Web应用程序中常见的安全实践。过滤器在Java Web开发中扮演着重要角色,尤其是在处理请求和响应时进行预处理和后处理。在这个主题中,我们将主要关注...

    ssh写的用户登录权限实现

    在本场景中,"ssh写的用户登录权限实现"指的是使用SSH协议来控制用户登录的权限,确保在同一时间只有一个用户能够使用特定的账号登录系统。这种机制可以防止未经授权的并发登录,增加系统的安全性。 Struts2、...

    Asp.net Mvc身份验证、异常处理、权限验证(拦截器)源码

    - `Demo\Controllers\Attribute`: 自定义属性(Attributes)的实现,可能包括身份验证、异常处理和权限验证的拦截器。 - `Demo\obj\Debug`: 编译过程中的中间文件,通常不直接涉及业务逻辑。 - `Demo\Scripts`: ...

    filter过滤器实现权限访问控制以及同一账号只能登录一台设备

    `Filter`过滤器是Java Servlet技术中的一种机制,用于对HTTP请求和响应进行预处理和后处理,从而实现诸如权限验证、数据转换、日志记录等功能。在这个场景中,我们将探讨如何使用`Filter`来实现权限访问控制,以及...

    Java Filter 限制用户浏览权限

    综上所述,Java Filter是实现用户浏览权限限制的关键工具。它允许我们在请求到达实际处理资源的Servlet之前进行干预,执行必要的身份验证和授权检查。通过对Filter的熟练运用,开发者可以构建出更加安全、可控的Web...

    过滤器 乱码,非法字符,权限

    在IT行业中,过滤器(Filter)是Java Web开发中的一个重要概念,主要应用于Servlet规范中,用于拦截请求和响应,执行一些预处理或后处理任务。本文将深入探讨标题和描述中涉及的几个关键知识点:过滤器乱码问题、...

    拦截到不同的登录页面

    在IT行业中,尤其是在Web应用程序...这通常涉及到在配置文件中定义拦截规则,编写中间件或过滤器代码,以及设计和实现自定义的认证和授权服务。理解这些概念和技术对于构建安全且用户体验良好的Web应用程序至关重要。

    spring boot实现过滤器和拦截器demo

    过滤器主要用于在请求被处理之前和之后进行预处理和后处理,如登录验证、编码转换、GZIP压缩等。在Spring Boot中,我们可以通过实现`javax.servlet.Filter`接口来创建自定义过滤器。以下是一个简单的`ActionFilter`...

    struts实现的权限分配

    1. **用户认证**:在Struts中,可以使用过滤器(如Jaas登录过滤器)或自定义Action来处理用户的登录请求。认证过程包括获取用户名和密码,验证它们与数据库中的记录是否匹配。一旦验证成功,将用户信息保存在Session...

    Spring Security 3多用户登录实现一

    - **Filter Security Interceptor (FSI)**:基于HTTP请求过滤器的安全拦截器,用于处理请求的权限检查。 - **Authentication Manager**:负责用户身份验证。 - **Access Decision Manager (ADM)**:决定用户是否...

    fiter过滤器的实现

    以`PeripheryLoginCheckFilter.java`为例,我们可以推测这是一个实现了登录检查功能的过滤器。它可能会在用户尝试访问特定资源之前,检查请求中是否存在有效的会话(Session)或认证令牌,如果没有,就重定向到登录...

    63丨职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?1

    在Java的Web开发中,职责链模式常用于实现**过滤器(Filter)**和**拦截器(Interceptor)**。这两种机制在不修改原有框架代码的基础上,为开发者提供了扩展功能的能力。 **Servlet Filter**是Java Servlet规范定义...

    windows系统下usb过滤驱动实现

    在实现USB过滤驱动时,可以选择使用KMDF来构建驱动程序,因为它提供了丰富的API和事件处理机制,可以方便地实现设备的管理和控制。 3. **WDF(Windows Driver Foundation)**:KMDF是WDF的一部分,WDF是一个更广泛...

Global site tag (gtag.js) - Google Analytics