@Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY = "Token"; @Autowired private TokenService tokenService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //支持跨域请求 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态 if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { response.setStatus(HttpStatus.OK.value()); return false; } IgnoreAuth annotation; if (handler instanceof HandlerMethod) { annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); } else { return true; } //从header中获取token String token = request.getHeader(LOGIN_TOKEN_KEY); /** * 不需要验证权限的方法直接放过 */ if(annotation!=null) { return true; } TokenEntity tokenEntity = null; if(StringUtils.isNotBlank(token)) { tokenEntity = tokenService.getTokenEntity(token); } if(tokenEntity != null) { request.getSession().setAttribute("userId", tokenEntity.getUserid()); request.getSession().setAttribute("role", tokenEntity.getRole()); request.getSession().setAttribute("tableName", tokenEntity.getTablename()); request.getSession().setAttribute("username", tokenEntity.getUsername()); return true; } PrintWriter writer = null; response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); try { writer = response.getWriter(); writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); } finally { if(writer != null){ writer.close(); } } // throw new EIException("请先登录", 401); return false; } }
时间: 2023-06-15 19:06:59 浏览: 187
这是一个基于 Spring 框架的拦截器,用于实现权限验证功能。在每次请求到达控制器之前,该拦截器会检查请求头中是否存在名为 "Token" 的字段,并根据该字段去数据库中查询对应的 Token 实体。如果查询到 Token 实体,则将用户的相关信息存储到当前会话中,然后放行该请求,否则返回未登录的错误信息。该拦截器还实现了跨域请求的支持,将请求头中的 Origin 字段写入响应头的 "Access-Control-Allow-Origin" 字段中,从而允许跨域请求。同时,对于 OPTIONS 请求,直接返回正常状态,不做任何处理。
相关问题
@Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY = "Token"; @Autowired private TokenService tokenService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //支持跨域请求 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); IgnoreAuth annotation; if (handler instanceof HandlerMethod) { annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); } else { return true; }解析代码
这是一个基于Spring框架的拦截器,用于拦截HTTP请求并进行身份验证。具体来说,在每个请求到达处理程序之前,该拦截器会检查请求头中是否包含一个名为"Token"的字段。如果包含该字段,则将其传递给TokenService进行身份验证。如果验证成功,则该请求将被允许进入处理程序;否则,该请求将被拒绝。
此外,该拦截器还处理了跨域请求的相关设置,允许指定的HTTP头字段,以及支持从处理程序中排除身份验证的注释。
@Slf4j @Component public class UserAuthorizationInterceptor implements HandlerInterceptor { @Autowired private RsaProperties rsaProperties; @Value("${jwt.super.token.open}") private boolean openJwt; @Autowired private RedisUtils redisUtils;
这是一个 Java 类的代码片段,使用了 Spring 框架的注解。其中,@Slf4j 注解是 Lombok 提供的注解,用于自动生成日志记录器;@Component 注解用于将这个类注册为 Spring 容器中的组件;UserAuthorizationInterceptor 类实现了 HandlerInterceptor 接口,用于拦截请求并进行用户授权验证。
代码中通过 @Autowired 注解注入了 RsaProperties 类和 RedisUtils 类的实例,@Value 注解注入了一个 boolean 类型的配置属性。其中,RsaProperties 类和 RedisUtils 类可能是自定义的类,用于进行加密和缓存操作。
根据代码片段的内容,可以猜测这个类的作用是拦截请求并验证用户的身份,可能会使用 JWT(JSON Web Token)进行身份认证。在拦截器中,可能会使用 RSA 加密算法对数据进行保护,并使用 Redis 进行缓存操作。
阅读全文