• 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

  • 相关阅读:
    代码题(11)— 链表两数相加
    机器学习(十九)— xgboost初试kaggle
    【js】鼠标跟随效果
    【js】event(事件对象)详解
    【vue】vue +element 搭建项目,this.$nextTick用法
    【vue】vue +element 搭建及开发中项目中,遇到的错误提示
    【vue】vue +element 搭建项目,点击空白处关闭弹窗
    【js】把一个json对象转成想要的数组
    【vue】vue +element 搭建项目,使用el-date-picker组件遇到的坑
    【vue】vue +element 搭建项目,在使用InputNumber 计数器时遇到的问题
  • 原文地址:https://www.cnblogs.com/dj-blog/p/7535835.html
Copyright © 2020-2023  润新知