zoukankan      html  css  js  c++  java
  • 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页面被拦截

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

    输入账号密码登录成功

  • 相关阅读:
    [PA2014]Muzeum
    [TJOI2015]概率论
    To Do List
    【洛谷4172】 [WC2006]水管局长(LCT)
    HNOI2019退役记
    hdu 2159 FATE
    USACO 2019 January Contest, Platinum 题解
    luogu4774 [NOI2018]屠龙勇士
    NOI 2019游记
    loj #3145. 「APIO 2019」桥梁
  • 原文地址:https://www.cnblogs.com/lyh233/p/14008674.html
Copyright © 2011-2022 走看看