拦截器

作者: 神豪VS勇士赢 | 来源:发表于2018-08-11 16:36 被阅读4次

    公共能力。所有的action都希望执行。
    例子:登录拦截器
    如果没有登录,所有的除了登录之外的Action应该都不能访问。

    拦截器需要实现HandlerInterceptor接口
    preHandle:Handler方法之前执行
    postHandle进入Handler方法之后,返回modelAndView之前执行
    afterCompletion执行Handler完成执行此方法

    开发流程:
    第一步:开发登录拦截器 拦截器一般 都覆写preHandle 方法 其他方法看根据具体需求

    public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String requestURI = request.getRequestURI();
        /**
         * 当请求路径Controller 包含了 login 就直接放行
         */
        if(requestURI.indexOf("login")>0){
            return  true;
        }
        /**
         * 当请求包含base 的 Controller 直接放行 类似于游客可以直接访问的资源
         */
        if(requestURI.indexOf("base")>0){
            return  true;
        }
        //从session 里面获取信息 看看是否之前登陆过
        Object user = request.getSession().getAttribute("user");
        //如果登陆过  则放行
        if(user!=null){
            return  true;
        }
        //如果没有登录  不放心  重定向或者转发到 登录页
        response.sendRedirect("/login.jsp");
       // request.getRequestDispatcher("/login.jsp").forward(request,response);
    
        return 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 {
    
    }
    

    }

    第二步:开发登录Action

    @Controller
    public class LoginController {
    @RequestMapping("/login.do")
    public String doLogin(User user,HttpServletRequest request){
    if(user!=null){

            if("张颖豪".equals(user.getUsername())&&"123".equals(user.getPassword())){
                request.getSession().setAttribute("user" , user);
            }
        }
        return  "index";
    }
    @RequestMapping("/base.do")
    @ResponseBody
    public List<String>   basePage(){
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("这是一个访客可以访问的界面");
        arrayList.add("这是一个访客可以访问的界面a");
        arrayList.add("这是一个访客可以访问的界面b");
        arrayList.add("这是一个访客可以访问的界面c");
        return arrayList;
    
    }
    

    }

    第三步:配置拦截器
    /** 表示所有Controller之前都执行
    拦截系统中已经存在的请求。

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/><!-- 系统的所有请求 -->
            <bean class="com.zyh.interceptor.LoginInterceptor"></bean><!-- 登录拦截器 -->
        </mvc:interceptor>
    </mvc:interceptors>
    

    第四步: 测试

    当我们直接访问游客可以访问的路径的时候: 直接放行,允许访问


    image.png

    我们并没有对下面的路径设置放行操作,所以当我们访问此访问路径的时候 会走拦截器
    http://localhost:8080/pay/pay.do
    在浏览器 输入http://localhost:8080/pay/pay.do 之后发现 重定向到了 登录页

    image.png
    当我们登录成功之后 再次访问 http://localhost:8080/pay/pay.do
    image.png

    做登录拦截器的优势:不需要在每个action中做登录判断。只需要做一个拦截器,所有的action在具体执行之前都调用拦截器。管理系统适用。

    相关文章

      网友评论

          本文标题:拦截器

          本文链接:https://www.haomeiwen.com/subject/pdpdbftx.html