Spring MVC-拦截器

入门案例

定义两个拦截器

public class HandlerInterceptor1 implements HandlerInterceptor {

    //在执行handler之前来执行的
    //用于用户认证校验、用户权限校验
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        System.out.println("HandlerInterceptor1...preHandle");

        //如果返回false表示拦截不继续执行handler,如果返回true表示放行
        return true;
    }
    //在执行handler返回modelAndView之前来执行
    //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("HandlerInterceptor1...postHandle");

    }
    //执行handler之后执行此方法
    //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
    //实现 系统 统一日志记录
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("HandlerInterceptor1...afterCompletion");
    }

}
public class HandlerInterceptor2 implements HandlerInterceptor {

    //在执行handler之前来执行的
    //用于用户认证校验、用户权限校验
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        System.out.println("HandlerInterceptor2...preHandle");

        //如果返回false表示拦截不继续执行handler,如果返回true表示放行
        return true;
    }
    //在执行handler返回modelAndView之前来执行
    //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("HandlerInterceptor2...postHandle");

    }
    //执行handler之后执行此方法
    //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
    //实现 系统 统一日志记录
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("HandlerInterceptor2...afterCompletion");
    }

}

拦截器要实现HandlerInterceptor 接口,或者继承已经实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter(抽象类中已经将这三个方法实现了,到时候可以需要哪个就写哪个,而不用都写了)。

  • preHandle在执行Controller的方法之前调用。可以有多个拦截器,每个拦截器的调用会依据它的声明顺序依次执行。如果该方法的返回值为false,后续的拦截器和Controller都不会再执行,为true,则可以继续执行。
  • postHandle:在Controller方法调用之后,DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
  • afterCompletion:在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。

在springmvc.xml中配置


    <!--拦截器 -->
    <mvc:interceptors>
        <!--多个拦截器,顺序执行 -->
        <mvc:interceptor>
            <!-- /**可以拦截所有路径不管多少层 -->
            <mvc:mapping path="/**" />
            <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor1"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor2"></bean>
        </mvc:interceptor>

    </mvc:interceptors

随便在浏览器中访问一个方法

当两个拦截器都为true时,打印结果为

HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle
HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion

当都为false时

HandlerInterceptor1...preHandle

当第一个拦截器为true,第二个拦截器为false时

HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion

凡是preHandle返回true,afterCompletion必须执行。
想看原理的可以参看这篇博客,源码解析SpringMVC拦截器详解[附带源码分析] - format丶 - 博客园

http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html

拦截器应用-用户认证拦截

public class LoginInterceptor extends HandlerInterceptorAdapter {

    //在执行handler之前来执行的
    //用于用户认证校验、用户权限校验
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        //得到请求的url
        String url = request.getRequestURI();

        //判断是否是公开 地址
        //实际开发中需要公开 地址配置在配置文件中
        //...
        if(url.indexOf("login.action")>=0){
            //如果是公开 地址则放行
            return true;
        }

        //判断用户身份在session中是否存在
        HttpSession session = request.getSession();
        String usercode = (String) session.getAttribute("usercode");
        //如果用户身份在session中存在放行
        if(usercode!=null){
            return true;
        }
        //执行到这里拦截,跳转到登陆页面,用户进行身份认证
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

        //如果返回false表示拦截不继续执行handler,如果返回true表示放行
        return false;
    }
    <!--拦截器 -->
    <mvc:interceptors>
         <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="cn.itcast.springmvc.interceptor.LoginInterceptor"></bean> 
            </mvc:interceptor> 
    </mvc:interceptors>

login.jsp

<form action="${pageContext.request.contextPath }/login.action">
用户账号:<input type="text" name="usercode" /><br/>
用户密码 :<input type="password" name="password" /><br/>
<input type="submit" value="登陆"/>
</form>

success.jsp

<body>
用户名:${usercode}
密码:${password}
<a href="${pageContext.request.contextPath }/logout.action">退出</a>
</body>
//用户登陆提交方法
    @RequestMapping("/login")
    public String login(HttpSession session, String usercode,String password)throws Exception{
        if("admin".equals(usercode)){
            session.setAttribute("usercode", usercode);
            return "/WEB-INF/jsp/success.jsp";
        }

        return "/WEB-INF/jsp/login.jsp";
    }

    //用户退出
    @RequestMapping("/logout")
    public String logout(HttpSession session)throws Exception{

        //session失效
        session.invalidate();
        return "/WEB-INF/jsp/login.jsp";

    }

一开始访问Controller中的任何一个方法都会跳转到login.jsp。

当输入用户名admin,登陆后。就会把信息存到session中,就可以访问其他页面了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
Spring MVC中,拦截器可以用来在处理请求之前或之后进行一些额外的处理。要编写拦截器,你需要按照以下步骤进行操作: 1. 创建一个实现HandlerInterceptor接口的拦截器类,通常可以继承HandlerInterceptorAdapter类来简化实现。例如: ```java import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CustomInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截处理 return true; // 返回true表示继续处理请求,返回false表示中断请求处理 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后进行拦截处理,但在渲染视图之前 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在完成整个请求处理之后进行拦截处理,包括渲染视图之后 } } ``` 2. 在Spring配置文件中注册拦截器。例如,在XML配置中,可以使用<mvc:interceptors>元素来注册拦截器: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有路径 --> <bean class="com.example.CustomInterceptor"/> <!-- 拦截器类的全限定名 --> </mvc:interceptor> </mvc:interceptors> ``` 3. 你也可以为拦截器指定特定的路径,例如: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/admin/**"/> <!-- 只拦截以/admin/开头的路径 --> <bean class="com.example.CustomInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 这样,当请求匹配到拦截器所指定的路径时,拦截器的preHandle()方法将被调用。你可以在这个方法中进行一些前置处理,例如权限验证、日志记录等。 需要注意的是,拦截器可以有多个,并且按照注册顺序依次执行。如果有多个拦截器,那么在请求处理前后,它们的preHandle()、postHandle()和afterCompletion()方法将按照注册顺序被依次调用。 希望上述内容能对你有所帮助!如果你还有其他问题,请继续提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值