自定义拦截器
自定义拦截器
package net.xdclass.online_xdclass.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import net.xdclass.online_xdclass.utils.JWTUtils;
import net.xdclass.online_xdclass.utils.JsonData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class LoginInterceptor implements HandlerInterceptor {
/**
* 进入到controller之前的方法
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
String accesToken = request.getHeader("token");
if (accesToken == null) {
accesToken = request.getParameter("token");
}
if (StringUtils.isNotBlank(accesToken)) {
Claims claims = JWTUtils.checkJWT(accesToken);
if (claims == null) {
//告诉登录过期,重新登录
sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
return false;
}
//解密成功则放行
Integer id = (Integer) claims.get("id");
String name = (String) claims.get("name");
request.setAttribute("user_id", id);
request.setAttribute("name", name);
return true;//放行
}
}catch (Exception e){}
sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
return false;
}
/**
* 响应json数据给前端
* @param response
* @param obj
*/
public static void sendJsonMessage(HttpServletResponse response, Object obj){
try{
//对象序列化成JSON
ObjectMapper objectMapper = new ObjectMapper();
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(objectMapper.writeValueAsString(obj));
writer.close();
response.flushBuffer();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
注册自定义拦截器、放行路径
package net.xdclass.online_xdclass.config;
import net.xdclass.online_xdclass.interceptor.LoginInterceptor;
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;
/**
* 拦截器配置
*
* 不用权限可以访问url /api/v1/pub/
* 要登录可以访问url /api/v1/pri/
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截全部
registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/v1/pri/*/*/**")
//不拦截哪些路径 斜杠一定要加
.excludePathPatterns("/api/v1/pri/user/login","/api/v1/pri/user/register");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
携带token查询个人信息接口
- 直接解密token,获取个人信息
- 通过token解密查询数据库获取个人信息
Controller
/**
* 根据用户id查询用户信息
* @param request
* @return
*/
@GetMapping("find_by_token")
public JsonData findUserInfoByToken(HttpServletRequest request){
//拦截器已解密token,并且user_id、name 设置到 request作用域中
Integer userId = (Integer) request.getAttribute("user_id");
if(userId == null){
return JsonData.buildError("查询失败");
}
User user = userService.findByUserId(userId);
return JsonData.buildSuccess(user);
}
service
interface
public interface UserService {
/**
* 新增用户
* @param userInfo
* @return
*/
int save(Map<String, String> userInfo);
String findByPhoneAndPwd(String phone, String pwd);
User findByUserId(Integer userId);
}
impl
@Override
public User findByUserId(Integer userId) {
User user = userMapper.findByUserId(userId);
return user;
}
mapper
package net.xdclass.online_xdclass.mapper;
import net.xdclass.online_xdclass.model.entity.User;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
int save(User user);
User findByPhone(@Param("phone") String phone);
User findByPhoneAndPwd(@Param("phone") String phone, @Param("pwd") String pwd);
User findByUserId(@Param("user_id") Integer userId);
}
xml
<select id="findByUserId" resultType="User">
select * from user where id=#{user_id}
</select>
model @JsonIgnore pwd
package net.xdclass.online_xdclass.model.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.Date;
/**
* `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
* `name` varchar(128) DEFAULT NULL COMMENT '昵称',
* `pwd` varchar(124) DEFAULT NULL COMMENT '密码',
* `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
* `phone` varchar(64) DEFAULT '' COMMENT '手机号',
* `create_time` datetime DEFAULT NULL COMMENT '创建时间',
*/
public class User {
private Integer id;
private String name;
@JsonIgnore
private String pwd;
private String headImg;
private String phone;
private Date createTime;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", headImg='" + headImg + '\'' +
", phone='" + phone + '\'' +
", createTime=" + createTime +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getHeadImg() {
return headImg;
}
public void setHeadImg(String headImg) {
this.headImg = headImg;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
测试
localhost:8081/api/v1/pri/user/find_by_token
GET:Headers
token
xdclasseyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaGVhZF9pbWciOiJodHRwczovL3hkLXZpZGVvLXBjLWltZy5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20veGRjbGFzc19wcm8vZGVmYXVsdC9oZWFkX2ltZy8xNS5qcGVnIiwiaWQiOjgsIm5hbWUiOiJhbGljZSIsImlhdCI6MTYxMDUwMzM5NSwiZXhwIjoxNjExMTA4MTk1fQ.Hru8k9bwXd32t2iQX-6br_30M-HwiYKVerfChv_Recw
*** Response ***
{
"code": 0,
"data": {
"id": 8,
"name": "alice",
"headImg": "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/15.jpeg",
"phone": "12345678",
"createTime": "2021-01-13T02:02:28.000+00:00"
},
"msg": null
}