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写拦截器的全限定类名。

猜你喜欢

转载自www.cnblogs.com/huclouy/p/9484483.html