import java.lang.reflect.Method;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/27

  • @Description :

**/

public class AuthenticationInterceptor implements HandlerInterceptor {

@Autowired

UserInfoService userService;

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {

String token = httpServletRequest.getHeader(“token”);// 从 http 请求头中取出 token

// 如果不是映射到方法直接通过

if (!(object instanceof HandlerMethod)) {

return true;

}

HandlerMethod handlerMethod = (HandlerMethod) object;

Method method = handlerMethod.getMethod();

//检查是否有passToken注解,有则无需进行token校验

if (method.isAnnotationPresent(PassToken.class)) {

PassToken passToken = method.getAnnotation(PassToken.class);

if (passToken.required()) {

return true;

}

}

//检查有没有CheckToken的注解

if (method.isAnnotationPresent(CheckToken.class)) {

CheckToken CheckToken = method.getAnnotation(CheckToken.class);

if (CheckToken.required()) {

// 执行认证

if (token == null) {

throw new RuntimeException(“无token,请重新登录”);

}

// 获取 token 中的 user id

String userId;

try {

userId = JWT.decode(token).getAudience().get(0);

} catch (JWTDecodeException j) {

throw new RuntimeException(“您的token已坏掉了,请重新登录获取token”);

}

User user = userService.getUserInfoById(Integer.valueOf(userId));

if (user == null) {

throw new RuntimeException(“用户不存在,请重新登录”);

}

// 验证 token

JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getUI_PASSWORD())).build();

try {

jwtVerifier.verify(token);

}catch (InvalidClaimException e){

throw new RuntimeException(“无效token,请重新登录获取token”);

}catch (TokenExpiredException e){

throw new RuntimeException(“token已过期,请重新登录获取token”);

} catch (JWTVerificationException e) {

throw new RuntimeException(e.getMessage());

}

return true;

}

}

return true;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse,

Object o, ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse,

Object o, Exception e) throws Exception {

}

}

拦截器手动配置类,InterceptorConfig.java:

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/27

  • @Description :

**/

@Configuration

public class InterceptorConfig implements WebMvcConfigurer {

@Bean

public AuthenticationInterceptor authenticationInterceptor() {

return new AuthenticationInterceptor();

}

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(authenticationInterceptor())

.addPathPatterns(“/**”);

}

}

然后是普遍登录流程里需要用到的(包含token生成和解析方法,密码加密解密方法等等),

pojo :

User.java

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/26

  • @Description :

**/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class User {

private Integer UI_ID;

private String UI_USER_NAME;

private String UI_PASSWORD;

private String UI_STATUS;

private Long UI_CREATE_TIME;

private String UI_ROLES;

}

mapper:

UserMapper.java

这里为了方便,我就采取mybatis注解方式去操作数据库了。

import com.demo.elegant.pojo.User;

import org.apache.ibatis.annotations.*;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/26

  • @Description :

**/

@Mapper

public interface UserMapper {

@Select(“SELECT * FROM user_info WHERE UI_ID=#{userId}”)

User getUserInfoById(@Param(“userId”) Integer userId);

@Select(“SELECT * FROM user_info WHERE UI_USER_NAME=#{userName}”)

User getUserInfoByName(@Param(“userName”) String userName);

@Insert("INSERT INTO user_info ( UI_USER_NAME, UI_PASSWORD, UI_STATUS,UI_CREATE_TIME, UI_ROLES ) VALUES ( #{UI_USER_NAME}, #{UI_PASSWORD},#{UI_STATUS},#{UI_CREATE_TIME},#{UI_ROLES}) ")

@Options(useGeneratedKeys = true, keyProperty = “UI_ID”)

int addUser( User User);

}

service:

UserInfoService.java

import com.demo.elegant.pojo.User;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/26

  • @Description :

**/

public interface UserInfoService {

User getUserInfoById( Integer userId);

User getUserInfoByName( String userName);

int addUser( User User);

}

TokenService

import com.demo.elegant.pojo.User;

import java.util.Date;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/27

  • @Description :

**/

public interface TokenService {

public String getToken(User user, Date date);

}

serviceImpl:

UserInfoServiceImpl.java

import com.demo.elegant.mapper.UserMapper;

import com.demo.elegant.pojo.User;

import com.demo.elegant.service.UserInfoService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/26

  • @Description :

**/

@Service

public class UserInfoServiceImpl implements UserInfoService {

@Autowired

UserMapper userMapper;

@Override

public User getUserInfoById(Integer userId) {

return userMapper.getUserInfoById(userId);

}

@Override

public User getUserInfoByName(String userName) {

return userMapper.getUserInfoByName(userName);

}

@Override

public int addUser(User User) {

return userMapper.addUser(User);

}

}

TokenServiceImpl.java

import com.auth0.jwt.JWT;

import com.auth0.jwt.algorithms.Algorithm;

import com.demo.elegant.pojo.User;

import com.demo.elegant.service.TokenService;

import org.springframework.stereotype.Service;

import java.util.Date;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/27

  • @Description :

**/

@Service

public class TokenServiceImpl implements TokenService {

@Override

public String getToken(User user, Date date) {

String token=“”;

token= JWT.create()

.withAudience(String.valueOf(user.getUI_ID()))

.withExpiresAt(date) //过期时间配置

.sign(Algorithm.HMAC256(user.getUI_PASSWORD()));

return token;

}

}

最后是我们的登录接口,注册接口, UserInfoController.java:

import com.demo.elegant.jwtToken.PassToken;

import com.demo.elegant.jwtToken.CheckToken;

import com.demo.elegant.pojo.User;

import com.demo.elegant.service.TokenService;

import com.demo.elegant.service.UserInfoService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import org.springframework.web.bind.annotation.*;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

/**

  • @Author : JCccc

  • @CreateTime : 2019/11/26

  • @Description :

**/

@RestController

@RequestMapping(“/user”)

public class UserInfoController {

@Autowired

UserInfoService userService;

@Autowired

TokenService tokenService;

@Value(“${EXPIRE_TIME}”)

private String EXPIRE_TIME;

@CheckToken

@GetMapping(“/getUserByName/{userName}”)

public String getUser(@PathVariable(“userName”) String userName) {

User userInfoByName = userService.getUserInfoByName(userName);

return userInfoByName.toString();

}

//注册

@PassToken

@PostMapping(“/register”)

public String register(@RequestBody Map map) {

BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();

String encodePwd = bCryptPasswordEncoder.encode(String.valueOf(map.get(“password”)));

User User=new User();

User.setUI_USER_NAME(String.valueOf(map.get(“username”)));

User.setUI_PASSWORD(encodePwd);

User.setUI_STATUS(“0”);

User.setUI_CREATE_TIME(System.currentTimeMillis());

User.setUI_ROLES(String.valueOf(map.get(“roles”)));

int i = userService.addUser(User);

if (i==1){

return “注册成功”;

}

return “注册失败”;

}

//登录

@PostMapping(“/login”)

public Map<String, Object> login(@RequestBody Map user){

Map result=new HashMap();

User userForBase=userService.getUserInfoByName(String.valueOf(user.get(“username”)));

if(userForBase==null){

result.put(“message”,“登录失败,用户不存在”);

return result;

}else {

BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();

String dbPwd=userForBase.getUI_PASSWORD();

boolean matchesResult = bCryptPasswordEncoder.matches(String.valueOf(user.get(“password”)),dbPwd);

if (!matchesResult){

result.put(“message”,“登录失败,密码错误”);

return result;

}else {

Date expiresDate = new Date(System.currentTimeMillis()+Integer.valueOf(EXPIRE_TIME)601000);

String token = tokenService.getToken(userForBase,expiresDate);

result.put(“token”, token);

result.put(“expireTime”, EXPIRE_TIME);

result.put(“userId”, userForBase.getUI_ID());

return result;

}

}

}

@CheckToken

@GetMapping(“/afterLogin”)

public String afterLogin(){

return “你已通过验证,成功进入系统”;

}

}

PS: 注册接口里面所使用的密码加密与登录接口校验时使用的密码校验都是用的Spring Security的BCryptPasswordEncoder。

最后在启动类上,让_Spring Security不要自动装载_ ,毕竟这里只想用下__BCryptPasswordEncoder。

@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})

public class ElegantApplication {

public static void main(String[] args) {

SpringApplication.run(ElegantApplication.class, args);

}

}

最后就是简单的测试了,用postman先调用下注册接口,往数据库表里面添加下用户:

然后用这个帐号去调登录接口:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

OPPO等大厂,18年进入阿里一直到现在。**

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-HbM5qeET-1712109443916)]
[外链图片转存中…(img-0py1kzKN-1712109443917)]
[外链图片转存中…(img-eOIjT6qC-1712109443918)]
[外链图片转存中…(img-Vk97gkYp-1712109443918)]
[外链图片转存中…(img-CqHN7o0H-1712109443918)]
[外链图片转存中…(img-U7zEaxIf-1712109443919)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-4SI4PjlH-1712109443919)]

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-lK68SeAl-1712109443920)]

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐