1、
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
拦截器与过滤器的区别:
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序:过滤前 – 拦截前 – Action处理 – 拦截后 – 过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。
2、怎么写自定义拦截器<!-- 声明一个为default的拦截器 -->
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="auth" class="com.pb.intercept.AuthIntercepter"></interceptor>
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="auth"/>
<!-- 定义拦截器栈包含defaultstack拦截器栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 配置struts2框架运行时,默认执行自定义拦截器栈 -->
<default-interceptor-ref name="mystack"/>
<global-results>
<!-- 被拦截后调回登录页面 -->
<result name="login">/login.jsp</result>
</global-results>
</package>
应用到声明的包下,只要相应包下所有的action就会调用自定义的拦截器。
<package name="users" extends="default">
<!-- 登录 -->
<action name="login" class="userAction" method="login">
<result type="redirectAction">list</result>
<result name="input">/login.jsp</result>
</action>
</package>
写拦截器类:
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.pb.domain.Users;
public class AuthIntercepter extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Users loginUser=(Users) ActionContext.getContext().getSession().get("loginUser");
// 获得当前方法名.
//String methodName = invocation.getInvocationContext().getName();
//获取url,如果是login就是登陆时候响应的直接通过拦截返回方法,进入action中,
if(invocation.getProxy().getActionName().equals("login")){
//返回方法名,进入action
return invocation.invoke();
//如果获得url不是login可能就是登陆成功了,判断session中是否为空,不为空就是登陆成功的,
}else if(loginUser!=null){
return invocation.invoke();
//或者是非法url,直接 跳回登陆页面
}else{
return "login";
}
}
}
3、怎么编写过滤器
Web.xml配置,以下字段放在servlet下
<filter> <filter-name>sessionFilter</filter-name> <filter-class>com.FlyPig.util.filter_session</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import javax.servlet.http.HttpSession; 14 15 public class filter_session implements Filter { 16 private String encoding; 17 18 public filter_session() { 19 } 20 21 public void init(FilterConfig filterconfig) throws ServletException { 22 encoding = "utf-8"; 23 } 24 25 public void doFilter(ServletRequest servletrequest, 26 ServletResponse servletresponse, FilterChain filterchain) 27 throws IOException, ServletException { 28 servletrequest.setCharacterEncoding(encoding); 29 servletresponse.setCharacterEncoding(encoding); 30 HttpServletRequest req=(HttpServletRequest)servletrequest; 31 HttpSession session=req.getSession(); 32 HttpServletResponse resp=(HttpServletResponse) servletresponse; 33 34 String url=req.getRequestURI(); 35 System.out.println(url); 36 if(!url.equals("/FlyPig")&&!url.equals("/FlyPig/login.jsp")){ 37 if(session.getAttribute("username")==null||session.getAttribute("username")==""){ 38 resp.sendRedirect("login.jsp"); 39 return ; 40 } 41 } 42 43 44 filterchain.doFilter(servletrequest, servletresponse); 45 } 46 47 public void destroy() { 48 } 49 }
并附带了一个ssh的项目具体拦截器配置就在项目中,大家可以下载下来看一下