拦截器与过滤器的区别以及他们的配置

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的项目具体拦截器配置就在项目中,大家可以下载下来看一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值