过滤器和拦截器的比较及未登录用户权限限制的实现
2013-06-07 07:55
661 查看
需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。 过程:因为对过滤器和拦截器都不熟悉,开始两种方式都问题不断,后调试通过,贴在这里留作小结和备忘 过滤器filter实现 配置:web.xml [xhtml] view plaincopy? <filter> <filter-name>RightFilter</filter-name> <filter-class>com.***.rights.RightFilter</filter-class> </filter> <filter-mapping> <filter-name>RightFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>RightFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> 代码: [java] view plaincopy? mport 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.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class RightFilter extends HttpServlet implements Filter { public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) arg1; HttpServletRequest request=(HttpServletRequest)arg0; HttpSession session = request.getSession(true); String usercode = (String) session.getAttribute("usercode");// String url=request.getRequestURI(); if(usercode==null || usercode.equals("")) { //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转 if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 )) { response.sendRedirect("登录路径"); return ; } } //已通过验证,用户访问继续 arg2.doFilter(arg0, arg1); return; } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } 配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法 跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤 拦截器interceptor实现: 配置:struts.xml [xhtml] view plaincopy? <interceptors> <!--定义一个名为authority的拦截器--> <interceptor class="com.***.rights.RightInterceptor" name="rightInterceptor"/> <!--定义一个包含权限检查的拦截器栈--> <interceptor-stack name="mydefault"> <!--配置内建默认拦截器--> <interceptor-ref name="defaultStack"/> <!--配置自定义的拦截器--> <interceptor-ref name="rightInterceptor"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="mydefault" /> <!--定义全局Result--> <global-results> <result name="login">Login.jsp</result> <result name="error">/error.jsp </result> </global-results> 代码: [java] view plaincopy? import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.opensymphony.xwork2.ActionContext; public class RightInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { //System.out.println("拦截器开始验证"); try { ActionContext actionContext = ActionContext.getContext(); Map<String,Object> session = actionContext.getSession(); String user=session.get("usercode").toString(); //当前用户session无效且访问的action不是登录action时,执行拦截,跳转 if((user==null || user.equals("")) && !invocation.getAction().getClass().getName().equals("登录action")) { return Action.LOGIN; } } catch(Exception e) { e.printStackTrace(); return Action.LOGIN; } //System.out.println("拦截器通过验证"); return invocation.invoke();//执行访问的action } } 拦截器由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。拦截器截获用户对action的访问,如需要跳转,只需如action一样返回一个result,spring根据result的配置执行跳转。如无需跳转,可调用invocation.invoke();方法来执行用户请求的action。拦截器在action之前开始,在action完成后结束(如被拦截,action根本不执行) 如不进行处理,过滤器和拦截器都会将正常的登录操作屏蔽,因此过滤器中需要判断用户访问的url是否为登录操作或登录页面,拦截器中需要判断用户访问的action是否登录action。(暂未考虑其他区分方法,留问。) 具体配置不加说明,网上很多 |
相关文章推荐
- 过滤器和拦截器的比较及未登录用户权限限制的实现(ZHUAN)
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 过滤器和拦截器的比较及未登录用户权限限制的实现
- 基于SSH实现员工管理系统登录权限的过滤器与拦截器的综合使用
- AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
- angularjs给Model添加拦截过滤器,路由增加限制,实现用户登录状态判断
- AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
- angularjs给Model添加拦截过滤器,路由增加限制,实现用户登录状态判断
- angularjs给Model添加拦截过滤器,路由增加限制,实现用户登录状态判断
- spring Filter过滤器,Spring拦截未登录用户权限限制
- shiro框架---关于用户登录和权限验证功能的实现步骤(一)
- Spring Filter过滤器,Spring拦截未登录用户权限限制
- 过滤器实现单一用户登录
- Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】