// 判断是否存在令牌信息,如果存在,则允许登录
String accessToken = request.getHeader(“Authorization”);
if (null == accessToken) {
throw new CommonException(401, “无token,请重新登录”);
} else {
// 从Redis 中查看 token 是否过期
Claims claims;
try{
claims = TokenUtils.parseJWT(accessToken);
}catch (ExpiredJwtException e){
response.setStatus(401);
throw new CommonException(401, “token失效,请重新登录”);
}catch (SignatureException se){
response.setStatus(401);
throw new CommonException(401, “token令牌错误”);
}
String userName = claims.getId();
UserBase user = userBaseService.findUserByAccount(userName);
if (user == null) {
response.setStatus(401);
throw new CommonException(401, “用户不存在,请重新登录”);
}
// 当前登录用户@CurrentUser
request.setAttribute(CurrentUserConstants.CURRENT_USER, user);
return true;
}
} else {//不需要登录可请求
return true;
}
}
// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
// 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
/**
-
@BelongsProject:
-
@BelongsPackage: com.jdtaste.jdtastesso.web.intercepter.auth
-
@Author:
-
@CreateTime: 2018-07-04 15:45
-
@Description: 当前用户
*/
public class CurrentUserConstants {
/**
- 当前用户参数名
*/
public final static String CURRENT_USER = “CurrentUser”;
}
6.自定义参数解析器
/**
-
@BelongsPackage: com.jdtaste.jdtastesso.web.intercepter.auth
-
@Author:
-
@CreateTime: 2018-07-04 15:42
-
@Description: 自定义参数解析器
-
增加方法注入,将含有 @CurrentUser 注解的方法参数注入当前登录用户
*/
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
/*
- supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。
*resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。
-
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
System.out.println(“----------supportsParameter-----------” + parameter.getParameterType());
return parameter.getParameterType().isAssignableFrom(UserBase.class)//判断是否能转成UserBase 类型
&& parameter.hasParameterAnnotation(CurrentUser.class);//是否有CurrentUser注解
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
System.out.println(“--------------resolveArgument-------------” + parameter);
UserBase user = (UserBase) webRequest.getAttribute(CurrentUserConstants.CURRENT_USER, RequestAttributes.SCOPE_REQUEST);
if (user != null) {
return user;
}
throw new MissingServletRequestPartException(CurrentUserConstants.CURRENT_USER);
}
}
7.将拦截器和参数解析器加入容器
/**
-
@BelongsProject:
-
@BelongsPackage: com.jdtaste.jdtastesso.conf
-
@Author:
-
@CreateTime: 2018-07-04 10:03
-
@Description: 配置URLInterceptor拦截器,以及拦截路径
*/
@EnableWebMvc
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns(“//”);
super.addInterceptors(registry);
}
@Override
public void addArgumentResolvers(List argumentResolvers) {
argumentResolvers.add(currentUserMethodArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
/**
-
解决 拦截器中注入bean 失败情况出现
-
addArgumentResolvers方法中 添加
-
argumentResolvers.add(currentUserMethodArgumentResolver());
*/
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}
argumentResolvers.add(currentUserMethodArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
/**
-
解决 拦截器中注入bean 失败情况出现
-
addArgumentResolvers方法中 添加
-
argumentResolvers.add(currentUserMethodArgumentResolver());
*/
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}
8.Controller
@LoginRequired
@RequestMapping(value = “/token”)
public String token(@CurrentUser UserBase userBase,String account,String token) {
log.info(account+“----”+token);
log.info(“----”+userBase.getAccount());
log.info(“params==” + userBase.toString());
if (userBaseService.findUserByAccount(userBase.getAccount()) == null) {
return “账号不存在”;
} else {
UserBase result = null;
result = userBaseService.login(userBase);
//生成token
//String accessToken=TokenUtils.createJwtToken(userBase.getAccount());
if (result == null) {
return “密码错误”;
} else {
return “SUCCESS”;
}
}
}
@LoginRequired
@RequestMapping(value = “/token”)
public String token(@CurrentUser UserBase userBase,String account,String token) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
nity.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
[外链图片转存中…(img-wnJ3up3O-1711814605515)]
[外链图片转存中…(img-cao3MPS4-1711814605515)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!