SpringMVC——拦截器配置

一、springMVC拦截器的实现一般有两种方式

 第一种方式是要定义的Interceptor类要实现Spring的HandlerInterceptor 接口

 第二种方式是继承实现了抽象类HandlerInterceptorAdapter

二、实例

1、编写拦截器

public class UserInterceptor implements HandlerInterceptor{

    /**
     * 该方法在整个请求完成后执行,主要用来清理资源
     * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
    }
    /**
     * 该方法在Controller的方法调用后执行,在视图被渲染以前被调用,所以可以用来对ModelAndView对象进行操作
     * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
    }
    /**
     * 该方法在请求之前被调用
     * 该方法返回为true时拦截器才会继续往下执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) throws Exception {
        //用于判断用户是否登录
        boolean flag = false;
        
        User user = (User) request.getSession().getAttribute("user");
        if(user==null){
            request.setAttribute("message", "请先登录");
            request.getRequestDispatcher("loginPage.jsp").forward(request, response);
        }else{
            flag = true;
        }
        return flag;
    }
    
}

2、配置springmvc-config.xml,在里面配置拦截器,

<mvc:mapping path=""/>配置拦截路径

<mvc:exclude-mapping path=""/>配置不进行拦截的路径。

     <!-- 配置拦截器 -->
     <mvc:interceptors>
         <mvc:interceptor>
             <!-- 拦截路径 -->
             <mvc:mapping path="/*"/>
             <!-- 不拦截的路径 -->
             <mvc:exclude-mapping path="/login"/>
             <mvc:exclude-mapping path="/loginPage"/>
             <bean class="com.dj.interceptor.UserInterceptor"></bean>
         </mvc:interceptor>
      <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法  -->
     </mvc:interceptors>

3、编写controller

@Controller
public class UserController {

    @RequestMapping(value="/{pagename}")
    public String pageName(@PathVariable String pagename){
        return pagename;
        
    }
    @RequestMapping("login")
    public ModelAndView login(String username,String password
            ,ModelAndView mv,HttpSession session){
        
        if(username!=null&&username.equals("aaa")&&password!=null&&password.equals("111")){
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            session.setAttribute("user", user);
            mv.setViewName("success");
        }else{
            mv.addObject("message", "账号或密码错误");
            mv.setViewName("loginPage");
        }
        return mv;
    }
    
    @RequestMapping("success")
    public String success(){
        return "success";
        
    }
}

4、编写登录页面和显示登录成功的页面,显示登录成功的页面只有在登录后才能访问,如果没有登录就访问将会被拦截。

<form action="login" method="post">
    <!-- 提示信息 -->
    <font color="red">${requestScope.message }</font><br>
    用户名:<input type="text" name="username" /><br>
    密码:<input type="password" name="password"/>
    <input type="submit" value="登录"/>
</form>
<body>
     登陆成功!
</body>

5、测试

直接访问success页面被拦截

访问登录页面,因为配置了不进行拦截的路径,所以显示如下

输入账号密码登录成功

posted @ 2020-11-19 23:36  Arbitrary233  阅读(2007)  评论(0编辑  收藏  举报