Spring MVC拦截器

Spring MVC的interceptor拦截器拦截请求是通过实现HandlerInterceptor接口来完成的。

接来下举一个实例:

通过拦截器完成一个用户权限验证的功能—用户必须登录以后才能访问网站其他页面,如果没有登录就访问,则会被拦截器拦截,请求转发到登录页面并进行提示。

1.创建一个项目,导入相应的jar包,在web.xml中配置前端控制器。

2.编写一个实体类

private String username;
private String password;

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.编写一个拦截器

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;
    }
    
}

5.配置springmvc-config.xml,在里面配置拦截器,配置拦截路径和不进行拦截的路径。

<!-- spring可以自动去扫描base-package下面的包或者子包下面的java类
        如果扫描到有spring相关注解的类,则吧这个类注册为spring的bean    
     -->
     <context:component-scan base-package="com.dj.controller"/>
     <!-- 配置拦截器 -->
     <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>
     </mvc:interceptors>
          
     <!-- 视图解析器 -->    
     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <!-- 前缀 -->
         <property name="prefix">
             <value>/</value>
         </property>
         <!-- 后缀 -->
         <property name="suffix">
             <value>.jsp</value>
         </property>
     </bean>

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

<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>

7.测试

直接访问success页面被拦截

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

输入账号密码登录成功

 

 源码下载路径 https://files.cnblogs.com/files/dj-blog/Interceptor.zip

 

posted @ 2017-09-17 15:51  越过山丘-  阅读(207)  评论(0编辑  收藏  举报