拦截发送的请求,往请求里面加一些东西
实现拦截器只需要两步:
(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,拦截器才会去拦截