目录
废话不多说,上代码
引入依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
在config中创建包JWTConfig :
package com.buba.config;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
public class JWTConfig {
private static final String SIGN = "123456"; // 秘钥
/**
* 生成token
* @param map
* @return
*/
public static String getToken (Map<String,String> map){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE,7); // 默认7天过期
// 创建jwt builder
JWTCreator.Builder builder = JWT.create();
map.forEach((k,v)->{
builder.withClaim(k,v);
});
String token = builder.withExpiresAt(instance.getTime())
.sign(Algorithm.HMAC256(SIGN));
return token;
}
/**
* 验证token合法性
* @param token
*/
public static void verify(String token){
JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
/**
* 获取token中的payload
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
return verify;
}
/**
* 判断 token 是否过期
*/
public boolean isTokenExpired(Date expiration){
return expiration.before(new Date());
}
}
在config中创建JWTInter
package com.buba.config;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
public class JWTInter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
HashMap<String, Object> map = new HashMap<>();
try {
JWTConfig.verify(token);
return true;
} catch (TokenExpiredException e) {
map.put("state", false);
map.put("msg", "Token已过期");
} catch (SignatureVerificationException e){
map.put("state", false);
map.put("msg", "签名错误");
} catch (AlgorithmMismatchException e){
map.put("state", false);
map.put("msg", "加密不匹配");
} catch (Exception e) {
e.printStackTrace();
map.put("state", false);
map.put("msg", "无效");
}
String json = new ObjectMapper().writeValueAsString(map);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(json);
return false;
}
}
在Config中创建InterConfig监听
package com.buba.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor()).
excludePathPatterns("/User/UserId","/User/InsetUser") // 放行
.addPathPatterns("/**"); // 拦截除了"/user/**的所有请求路径
}
}
Controller层
@GetMapping("/UserId")
public Map<String,Object> selUser(@RequestBody User user) {
Map<String,Object> result = new HashMap<>();
try {
User userDB = userService.selUser(user);
Map<String, String> map = new HashMap<>();//用来存放payload
map.put("id",userDB.getU_id().toString());
map.put("username", userDB.getU_name());
String token = JWTConfig.getToken(map);
result.put("state",true);
result.put("msg","登录成功");
result.put("token",token); //成功返回token
} catch (Exception e) {
e.printStackTrace();
result.put("state","false");
result.put("msg",e.getMessage());
}
return result;
}
Srvice层
User selUser(User user);
ServiceImpl层
@Transactional(propagation = Propagation.SUPPORTS)
public User selUser(User user) {
User userDB = userMapper.selUser(user);
if(userDB!=null){
return userDB;
}
throw new RuntimeException("登录失败");
}
Mapper层
User selUser(User user);
Mapper.xml层
<select id="selUser" resultType="com.buba.User">
select * from user where u_name=#{u_name} and u_password = #{u_password} and sta_sid = 0
</select>