// 判断是否存在令牌信息,如果存在,则允许登录
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工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
alt=“img” style=“zoom: 33%;” />
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-1ad10Yx3-1711447309012)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!