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

 

转载于:https://www.cnblogs.com/huclouy/p/9484483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC自定义拦截器有以下步骤: 1. 创建一个实现HandlerInterceptor接口的拦截器类。在该类实现preHandle、postHandle、afterCompletion三个方法。 2. 在Spring配置文件配置该拦截器。可以使用<mvc:interceptors>标签配置,也可以使用注解@Configuration和@EnableWebMvc配置。 3. 配置拦截器的拦截规则。可以使用<mvc:interceptor>标签配置,也可以使用注解@Interceptor和@Order配置。 4. 使用拦截器。在Controller类或方法上使用注解@Interceptor或@WebMvcConfigurerAdapter.addInterceptors()方法添加拦截器。 以下是一个简单的示例: 1. 创建拦截器类 public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor afterCompletion"); } } 2. 配置拦截器 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> 3. 配置拦截规则 @Interceptor @Order(1) public class MyInterceptor implements HandlerInterceptor { ... } 4. 使用拦截器 @Controller public class MyController { @Interceptor(MyInterceptor.class) @RequestMapping("/hello") public String hello() { return "hello"; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值