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



struts2需要实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。过程:因为对过滤器和拦截器都不熟悉,开始两种方式都问题不断,后调试通过,贴在这里留作小结和备忘

 

过滤器filter实现

配置:web.xml

 

[xhtml] view plaincopyprint?
  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>












 

代码:

 

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

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 plaincopyprint?
  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 plaincopyprint?
  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.     @Override
  9.     public String intercept(ActionInvocation invocation) throws Exception {
  10.         //System.out.println(“拦截器开始验证”);
  11.         try
  12.         {
  13.             ActionContext actionContext = ActionContext.getContext();
  14.             Map<String,Object> session = actionContext.getSession();
  15.             String user=session.get(“usercode”).toString();
  16.             //当前用户session无效且访问的action不是登录action时,执行拦截,跳转
  17.             if((user==null || user.equals(“”)) && !invocation.getAction().getClass().getName().equals(“登录action”))
  18.             {
  19.                 return Action.LOGIN;
  20.             }
  21.         }
  22.         catch(Exception e)
  23.         {
  24.             e.printStackTrace();
  25.             return Action.LOGIN;
  26.         }
  27.         //System.out.println(“拦截器通过验证”);
  28.         return invocation.invoke();//执行访问的action
  29.     }
  30. }







@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。(暂未考虑其他区分方法,留问。)

http://blog.csdn.net/zlcoy_1/article/details/5009198