zoukankan      html  css  js  c++  java
  • Spring mvc中自定义拦截器

    一、要实现的一个功能:

      1、打开特定的一些页面时必需强制用户进行登录。

      2、登录后再返回到之前的页面。

    二、先写一个service,实现从cookie中判断用户是否登录。

      1、TT_TOKEN为登录成功时,响应给浏览器的Cookie的键。

    @Service
    public class UserServiceImpl implements UserService{
    
        @Value("${SSO_BASE_URL}")
        private String SSO_BASE_URL;
        @Value("${SSO_USER_INFO}")
        private String SSO_USER_INFO;
    
        @Override
        public TbUser getCookieByToken(HttpServletRequest request, HttpServletResponse response) {
            try{
                String token = CookieUtils.getCookieValue(request, "TT_TOKEN");
                if (StringUtils.isBlank(token)) {
                    return null;
                }
                //cookie中如果取到值,调用sso服务从cookie取到用户信息
                String json = HttpClientUtil.doGet(SSO_BASE_URL + SSO_USER_INFO + token);
                TaotaoResult result = TaotaoResult.format(json);
                if (result.getStatus() != 200) {
                    return null;
                }
                result = TaotaoResult.formatToPojo(json, TbUser.class);
                TbUser user = (TbUser) result.getData();
                return user;
            }catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }

    二、拦截器代码如下

      1、定义一个拦截器LoginInterceptor实现spring mvc的接口HandlerInterceptor。

      2、重写里面三个方法。

    public class LoginInterceptor implements HandlerInterceptor{
    
        @Autowired
        private UserService userService;
        @Value("${SSO_LOGIN_URL}")
        private String SSO_LOGIN_URL;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            TbUser user = userService.getCookieByToken(request, response);
            if (user == null) {
                response.sendRedirect(SSO_LOGIN_URL + "?redirectUrl=" + request.getRequestURL());
                return false;
            }
            return true;
            //返回false说明拦截, true放行
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            //拦截后,返回modelAndView之前
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            //返回modelAndView之后
        }
    }

    三、在spingmvc.xml配置拦截器

    <!-- 配置拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/item/**"/>
                <bean class="com.taotao.portal.Interceptor.LoginInterceptor" />
            </mvc:interceptor>
        </mvc:interceptors>

      1、path为要拦截的路径。

      2、bean写拦截器的全限定类名。

  • 相关阅读:
    django页面分类和继承
    django前端从数据库获取请求参数
    pycharm配置django工程
    django 应用各个py文件代码
    CF. 1428G2. Lucky Numbers(背包DP 二进制优化 贪心)
    HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)
    小米邀请赛 决赛. B. Rikka with Maximum Segment Sum(分治 决策单调性)
    区间树 学习笔记
    CF GYM. 102861M. Machine Gun(主席树)
    2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) (B, D, G, H)
  • 原文地址:https://www.cnblogs.com/huclouy/p/9484483.html
Copyright © 2011-2022 走看看