第八讲 拦截器

一、拦截器概念

二、实现拦截器

  1. 实现HandlerInterceptor接口

publicclass MyInterceptor implementsHandlerInterceptor {
     
     //在请求处理的方法之前执行
     //如果返回true那么执行下一个拦截器,如果返回false那么不执行下一个拦截器
     publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response,
                Objecthandler)
                throwsException {
           
           System.out.println("--------处理前--------");
           returntrue;
     }
     
     //在请求处理的方法执行之后执行
     publicvoid postHandle(HttpServletRequest request, HttpServletResponse response,
                Objecthandler,
                ModelAndViewmodelAndView)throws Exception {
           System.out.println("--------处理后--------");
     }
     
     //在DispatcherServlet处理后执行---清理工作
     publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response,
                Objecthandler, Exceptionex)
                throwsException {
           //TODO Auto-generated method stub
           
     }
}

  1. 配置拦截器

<beansxmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:mvc="http://www.springframework.org/schema/mvc"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc.xsd">

     <!-- 拦截器配置 -->
     <mvc:interceptors>
           <mvc:interceptor>
                <!-- /** 包括路径及其子路径 - 拦截所有的Controller
                     如果是/admin/* 拦截的是 /admin/add,/admin/list etc. /admin/user/add不被拦截
                     如果是/admin/** 拦截的是 /admin/add,/admin/list,/admin/user/add
                -->
                <mvc:mappingpath="/**"/>
                <!-- 对应的拦截器 -->
                <beanclass="com.liujie.interceptor.MyInterceptor"></bean>
           </mvc:interceptor>
     </mvc:interceptors>


  1. 如果被拦截-能否到达指定的页面?

   使用HttpServletResponse或者HttpServletRequest可以实现转发重定向

     //在请求处理的方法之前执行
     //如果返回true那么执行下一个拦截器,如果返回false那么不执行下一个拦截器
     publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response,
                Objecthandler)
                throwsException {
           
           System.out.println("--------处理前--------");
           System.out.println(request.getContextPath());
           response.sendRedirect(request.getContextPath() + "/index.jsp");
           returnfalse;
     }

这里被拦截的情况就是:return false;


   return false;

   return true;

  1. 拦截器应用-登录拦截器









Controller

@Controller
publicclass UserController {
     
     @RequestMapping(value ="/login")
     publicString login(User user, HttpSession session) {
           
           if("siggy".equals(user.getName()) && "111".equals(user.getPwd())) {
                session.setAttribute("user",user);
                return"redirect:/index.jsp";
           }
           
           return"redirect:/login.jsp";
     }
     
     @RequestMapping("/add")
     publicString add() {
           System.out.println("add");
           return"redirect:/index.jsp";
     }
}










拦截器

publicclass LoginInterceptor implementsHandlerInterceptor {
     //允许哪些url不被拦截,哪些需要被拦截
     privateList<String> allowedPass;
     publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response,
                Objecthandler)
                throwsException {
           
           Stringurl = request.getRequestURL().toString();
           //先判断session中是否有
           Objectuser = request.getSession().getAttribute("user");
           if(user!= null) {
                returntrue;
           }
           for(Stringtemp : allowedPass) {
                if(url.endsWith(temp)) {
                     returntrue;
                }
           }
           response.sendRedirect(request.getContextPath() + "/login.jsp");
           returnfalse;
     }
     
     publicvoid postHandle(HttpServletRequest request, HttpServletResponse response,
                Objecthandler,
                ModelAndViewmodelAndView)throws Exception {
     }
     
     publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response,
                Objecthandler, Exceptionex)
                throwsException {
           
     }
     publicvoid setAllowedPass(List<String> allowedPass) {
           this.allowedPass= allowedPass;
     }
}











   配置

     <!-- 拦截器配置 -->
     <mvc:interceptors>
           <mvc:interceptor>
                <!-- /** 包括路径及其子路径 - 拦截所有的Controller
                     如果是/admin/* 拦截的是 /admin/add,/admin/list etc. /admin/user/add不被拦截
                     如果是/admin/** 拦截的是 /admin/add,/admin/list,/admin/user/add
                -->
                <!--
                <mvc:mapping path="/product/*"/>
                <mvc:mapping path="/cart/*"/>
                <mvc:mapping path="/order/*"/>
                
                <mvc:exclude-mapping path="/user/*"/>
                -->
                <mvc:mappingpath="/**"/>
                <!-- 对应的拦截器 -->
                <beanclass="com.liujie.interceptor.LoginInterceptor">
                     <propertyname="allowedPass">
                           <list>
                                <value>login.do</value>
                                <!-- <value>add.do</value> -->
                           </list>
                     </property>
                </bean>
           </mvc:interceptor>
     </mvc:interceptors>





   JSP

<body>
     <formaction="login.do"method="post">
           用户名:<inputname="name"type="text"/><br>
           密码:<inputname="pwd"type="password"/><br>
           <inputtype="submit"value="submit"/>
     </form>
</body>




   实体类

publicclass User {
     
     privateint id;
     privateString name;
     privateString pwd;
    
    //下面省略get、set方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值