需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。
过程:因为对过滤器和拦截器都不熟悉,开始两种方式都问题不断,后调试通过,贴在这里留作小结和备忘
过滤器filter实现
配置:web.xml
- <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>
代码:
- mportjava.io.IOException;
- importjavax.servlet.Filter;
- importjavax.servlet.FilterChain;
- importjavax.servlet.FilterConfig;
- importjavax.servlet.ServletException;
- importjavax.servlet.ServletRequest;
- importjavax.servlet.ServletResponse;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importjavax.servlet.http.HttpSession;
- publicclassRightFilterextendsHttpServletimplementsFilter{
- publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
- FilterChainarg2)throwsIOException,ServletException{
- HttpServletResponseresponse=(HttpServletResponse)arg1;
- HttpServletRequestrequest=(HttpServletRequest)arg0;
- HttpSessionsession=request.getSession(true);
- Stringusercode=(String)session.getAttribute("usercode");//
- Stringurl=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;
- }
- publicvoidinit(FilterConfigarg0)throwsServletException{
- //TODOAuto-generatedmethodstub
- }
配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法
跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤
拦截器interceptor实现:
配置:struts.xml
- <interceptors>
- <!--定义一个名为authority的拦截器-->
- <interceptorclass="com.***.rights.RightInterceptor"name="rightInterceptor"/>
- <!--定义一个包含权限检查的拦截器栈-->
- <interceptor-stackname="mydefault">
- <!--配置内建默认拦截器-->
- <interceptor-refname="defaultStack"/>
- <!--配置自定义的拦截器-->
- <interceptor-refname="rightInterceptor"/>
- </interceptor-stack>
- </interceptors>
- <default-interceptor-refname="mydefault"/>
- <!--定义全局Result-->
- <global-results>
- <resultname="login">Login.jsp</result>
- <resultname="error">/error.jsp</result>
- </global-results>
代码:
- importjava.util.HashMap;
- importjava.util.Map;
- importcom.opensymphony.xwork2.Action;
- importcom.opensymphony.xwork2.ActionInvocation;
- importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
- importcom.opensymphony.xwork2.ActionContext;
- publicclassRightInterceptorextendsAbstractInterceptor{
- @Override
- publicStringintercept(ActionInvocationinvocation)throwsException{
- //System.out.println("拦截器开始验证");
- try
- {
- ActionContextactionContext=ActionContext.getContext();
- Map<String,Object>session=actionContext.getSession();
- Stringuser=session.get("usercode").toString();
- //当前用户session无效且访问的action不是登录action时,执行拦截,跳转
- if((user==null||user.equals(""))&&!invocation.getAction().getClass().getName().equals("登录action"))
- {
- returnAction.LOGIN;
- }
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- returnAction.LOGIN;
- }
- //System.out.println("拦截器通过验证");
- returninvocation.invoke();//执行访问的action
- }
- }
拦截器由spring管理,只对action起作用,不能拦截jsp页面、图片等其他资源。拦截器截获用户对action的访问,如需要跳转,只需如action一样返回一个result,spring根据result的配置执行跳转。如无需跳转,可调用invocation.invoke();方法来执行用户请求的action。拦截器在action之前开始,在action完成后结束(如被拦截,action根本不执行)
如不进行处理,过滤器和拦截器都会将正常的登录操作屏蔽,因此过滤器中需要判断用户访问的url是否为登录操作或登录页面,拦截器中需要判断用户访问的action是否登录action。(暂未考虑其他区分方法,留问。)
转自:http://blog.csdn.net/zlcoy_1/article/details/5009198