一般我们的都会用到登录验证,原理是:
登录成功后,服务端的session中会存在一个cookie,一般叫做JSESSIONID。
而有些请求需要登录状态才能操作,当请求比较多的时候,如果在每个controller里面获取session中的cookie然后再判断,会多次写重复代码先得非常冗余,特别是项目比较大的时候。这就不是我们想看到了,于是我们采用拦截器这种方式来处理登录验证。
登录验证的实现方式有两种:一、拦截器HandlerInterceptor 二、Spring AOP
方法一是在http请求层面的,相对简单,功能没有那么强大。
方法二则是spring的AOP特性,具体到某个类,十分强大,相对麻烦一点。
我主要介绍HandlerInterceptor的使用:
大概分为以下几步:
一、创建Interceptor并实现HandlerInterceptor接口;
二、创建配置类实现WebMvcConfigurer,并设置拦截路径
一、创建Interceptor并实现HandlerInterceptor接口;
package cn.swpu.mall.interceptor;
import cn.swpu.mall.consts.MallConst;
import cn.swpu.mall.exception.UserLoginException;
import cn.swpu.mall.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Date 2020/11/30 19:08
*/
@Slf4j
public class UserLoginInterceptor implements HandlerInterceptor {
/**
* true 表示流程继续 false 表示中断
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle --->");
User user = (User) request.getSession().getAttribute(MallConst.CURRENT_USER);
if (user == null) {
// 返回数据的两种方式: 不推荐,只能返回string,需要再次序列化 response.getWriter().println("error") 新建异常:
//这里是我通过抛出异常的方法,来返回json
throw new UserLoginException();
}
return true;
}
}
二、创建配置类实现WebMvcConfigurer,并设置拦截路径
package cn.swpu.mall.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @Author 冰翔
* @Date 2020/11/30 19:23
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserLoginInterceptor())
//设置拦截路径,我是全部拦截,根据自己项目配置
.addPathPatterns("/**")
//设置不拦截的路径
//登录不用拦截,把登录拦截了,登录都需要已经登录的cookie这不就逻辑冲突了,注册也一样
.excludePathPatterns("/user/login", "/user/register");
}
}
需要注意配置和注解,以及实现的包路径。