拦截器Interceptor

拦截发送的请求,往请求里面加一些东西

实现拦截器只需要两步:

(1)定义一个类,这个类实现HandlerInceptor接口,这个接口中有几个方法,看情况重写其中几个,里面有几个方法,preHandle方法是在调用Controller之前执行,postHandler方法是在执行完Controller之后,还没有被模板引擎渲染之前执行,afterCompletion方法是在模板引擎执行完之后执行

@Component
public class AlphaIntecepter implements HandlerInterceptor
{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        return HandlerInterceptor.super.preHandle( request, response, handler );
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle( request, response, handler, modelAndView );
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion( request, response, handler, ex );
    }
}

(2)配置这个拦截器(让一个类实现WebMvcConfigurer接口,指定这个拦截器拦截哪些请求,不拦截 哪些请求

@Configuration
public class WebMvcConfig implements WebMvcConfigurer
{
    @Autowired
    private AlphaIntecepter alphaIntecepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
       registry.addInterceptor( alphaIntecepter )//这表示拦截一切请求,下面exclude表示不拦截以下请求
        .excludePathPatterns( "/**/*.css","/**/*.css" )//表示访问css文件.png图片等文件不拦截
               .addPathPatterns( "/register","/login") //对这些路径进行拦截
        
    }
}

以登录拦截器为例:

 HandlerIntercepter  是拦截器

LoginHandlerIntercepter  是登录拦截器

访问页面时,先判断用户有没有登录,如果没有登录,就跳转到登录界面

如果登录了,就会往session里面添加:(用户名作为value)

session.setAttribute("loginUser",username);
public  class  implements   HandlerInterceptor
{
   @Override
   public  boolean  preHandle(HttpServletRequest  request,HttpServletResponse  response,Object handler)
   
   Object  loginUser=request.getSession().getAttribute("loginUser");

    if(loginUser==null)
    {
       重定向到登录页面
       return false;//表示不放行
    }
    else
    {
      
       return true;//放行
    }

}
@Configuration
public  class  MyMvcConfig implements WebMvcConfigurer
{
   @Override
   public  void  addInterceptors(InterceptorRegistry registry)
   {
         registry.addIntereptor(new  LoginHandlerInterceptor())
                 .addPathPatterns("/**")//表示所有的路径都进行拦截
                 .excludePathPatterns("/index.html","/user/login","/css/")//这些路径不进行拦截

   }


}

或者去cookie里面找

@Component
public class LoginIntecepter implements HandlerInterceptor
{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        Cookie[]  cookies=request.getCookies();//获取请求里面所有的cookies

        if(cookie!=null)
        {
             for(Cookie cookie:cookies)
             {
                 if(cookie.getName().equals("ticket"))//查找key-value里key为ticket的键值对,取出value
                 {
                   String ticket=cookie.getValue();//那这个ticket的值去login_ticket这个表中查,返回的是一个LoginTicket对象(代表login_ticket表中的一行)
                  LoginTicket loginTicket=selectByTicket("ticket");

                  if(loginTicket!=null&&loginTicket.getStatus()==0)//如果login_ticket表中ticket有效
                  {
                    //取出这个ticket对应的User类对象 
                    User  user=userService.findUserById(loginTicket.getUserId());    
                  }
                   
                 }
             }
        }
    }
}

 拿到这个对象之后,可以将这个对象放到某个地方,比如ThreadLocal里面,如果ThreadLocal里面有user对象就展示同一个页面的A形态,否则就展示同一个页面的B形态

@Configuration
public class WebMvcConfig implements WebMvcConfigurer
{
    @Autowired
    private LoginIntecepter loginIntecepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
       registry.addInterceptor(loginIntecepter )//这表示拦截一切请求,下面exclude表示不拦截以下请求
        .excludePathPatterns( "/**/*.css","/**/*.css" )//表示访问css文件.png图片等文件不拦截
               .addPathPatterns( "/register","/login") //对这些路径进行拦截
        
    }
}

也就是你只有访问localhost:8080/register和localhost:8080/login,拦截器才会去拦截

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值