发表于: 2020-06-29 23:25:12

1 1910


今天完成的事:


过滤器和拦截器的区别:

1、拦截器是基于Java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

执行顺序:过滤前 - 拦截前 - Action处理 - 拦截后 -过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器的后续操作。


过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。


拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。


监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。


context-param:就是一些需要初始化的配置,放入context-param中,从而被监听器(这里特指org.springframework.web.context.ContextLoaderListener)监听,然后加载;

监听器(listener):就是对项目起到监听的作用,它能感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化;

过滤器(filter):就是对请求起到过滤的作用,它在监听器之后,作用在servlet之前,对请求进行过滤;

servlet:就是对request和response进行处理的容器,它在filter之后执行,servlet其中的一部分就是controller层(标记为servlet_2),还包括渲染视图层(标记为servlet_3)和进入controller之前系统的一些处理部分(servlet_1),另外我们把servlet开始的时刻标记为servlet_0,servlet结束的时刻标记为servlet_4。

拦截器(interceptor):就是对请求和返回进行拦截,它作用在servlet的内部,具体来说有三个地方:

1)servlet_1和servlet_2之间,即请求还没有到controller层

2)servlet_2和servlet_3之间,即请求走出controller层次,还没有到渲染时图层

3)servlet_3和servlet_4之间,即结束视图渲染,但是还没有到servlet的结束


它们之间的关系,可以用一张图来表示:





关于拦截器的使用

编写一个拦截器的类

public class MyInterceptor implements HandlerInterceptor {

//在请求处理的方法之前执行
   //如果返回true执行下一个拦截器
   //如果返回false就不执行下一个拦截器
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
// 如果是首页面则放行
       System.out.println("uri: " + request.getRequestURI());
       if (request.getRequestURI().contains("main")) {
return true;
       }

// 如果是登陆页面则放行
       System.out.println("uri: " + request.getRequestURI());
       if (request.getRequestURI().contains("login")) {
return true;
       }

HttpSession session = request.getSession();

       // 如果用户已登陆也放行
       if(session.getAttribute("user") != null) {
return true;
       }

// 用户没有登陆跳转到登陆页面
       request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
       return false;
   }

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}


配置拦截器

<mvc:interceptors>
   <mvc:interceptor>
       <!--/** 包括路径及其子路径-->
       <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
       <!--/admin/** 拦截的是/admin/下的所有-->
       <mvc:mapping path="/**"/>
       <!--bean配置的就是拦截器-->
       <bean class="com.ptt.utils.MyInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>


编写一个登录页面

<form action="${pageContext.request.contextPath}/user/login">
   用户名:<input type="text" name="username"> <br>
   密码:<input type="password" name="pwd"> <br>
   <input type="submit" value="提交">

</form>


编写controller

public class UserController {
//首页
   @RequestMapping("/main")
public String main(){
return "main";
   }

//跳转到登陆页面
   @RequestMapping("/jumplogin")
public String jumpLogin() throws Exception {
return "login";
   }

//跳转到成功页面
   @RequestMapping("/jumpSuccess")
public String jumpSuccess() throws Exception {
return "success";
   }

//登陆提交
   @RequestMapping("/login")
public String login(HttpSession session, String username, String pwd) throws Exception {
// session记录用户身份信息
       System.out.println("接收前端==="+username);
       session.setAttribute("user", username);
       return "success";
   }

//退出登陆
   @RequestMapping("logout")
public String logout(HttpSession session) throws Exception {
// session 过期
       session.invalidate();
       return "login";
   }



明天计划的事:继续任务五

遇到的困难:

收获:










返回列表 返回列表
评论

    分享到