public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String token = httpServletRequest.getHeader("token"); try { if (StrUtil.isNotBlank(token)) { // 获取 token payload 信息 PayloadDataDTO payloadDataDTO = RsaTokenUtil.verifyAccessToken(token, RsaTokenUtil.generatePublicKey(KeyFactory.getInstance("RSA"))); // 根据用户名查询用户 UserDO userDO = userMapper.getByUserName(payloadDataDTO.getUserName()); // 单点登录判断 if(token.equals(userDO.getAccessToken())){ //security自带的框架,通过才能进入 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(payloadDataDTO, null, null); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); SecurityContextHolder.getContext().setAuthentication(authentication); //把通过的东西放到自定义的实体里 servletRequest.setAttribute("userInfo", payloadDataDTO); } }
时间: 2023-06-18 09:04:00 浏览: 118
这段代码是一个 Servlet 过滤器的实现,用于验证用户的身份信息。具体实现步骤如下:
1. 从 ServletRequest 中获取 HttpServletRequest 对象,并从中获取请求头中的 token 值。
2. 使用 RsaTokenUtil 工具类中的 verifyAccessToken 方法对 token 进行验证和解析,得到 token 中包含的 payload 数据。
3. 使用 payload 中的用户名查询数据库,获取该用户的信息。
4. 判断用户的 token 是否与数据库中存储的相同,如果相同则说明该用户已经通过了单点登录验证。
5. 如果通过了验证,则使用 Spring Security 的 UsernamePasswordAuthenticationToken 对象将通过验证的用户信息放入 SecurityContextHolder 中,以便后续的操作可以直接从中获取用户信息。
6. 最后,将用户信息放入 ServletRequest 的 attribute 中,以便后续的操作可以直接从中获取用户信息。
需要注意的是,这段代码中使用了自定义的 PayloadDataDTO 类和 RsaTokenUtil 工具类,这些代码需要根据具体的项目进行实现。同时,该过滤器的实现需要在 Spring Security 的配置文件中进行注册。
相关问题
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
这是一个Java Servlet中的过滤器(Filter)代码,用于拦截HTTP请求,在处理请求之前或之后执行一些额外的操作。
在doFilter()方法中,servletRequest对象表示请求的信息,servletResponse对象表示响应的信息,filterChain对象表示过滤器链,用于调用下一个过滤器或Servlet。
在该方法中,可以对请求进行一些预处理,如检查请求参数、身份验证、安全性检查等。也可以对响应进行一些后处理,如添加响应头、设置响应状态码、压缩响应数据等。
总之,过滤器是一个非常有用的工具,可以在应用程序中实现很多功能,如日志记录、性能监控、缓存控制等。
chain.doFilter 是不是public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {?
是的,您说得对。`chain.doFilter` 方法通常是一个公开(public)的,用于处理HTTP请求和响应的方法。它的签名通常是这样的:
```java
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws ServletException, IOException
```
这个方法接受三个参数:
1. `ServletRequest req`:代表当前请求的数据,包含了客户端发送过来的信息。
2. `ServletResponse resp`:代表服务器向客户端返回响应的工具,可以设置状态码、响应头和响应体。
3. `FilterChain chain`:用于向下传递请求的链,调用这个方法实际上是将控制权委托给这个链中的下一个过滤器或Servlet。
当这个方法被调用时,如果有异常发生,可能会抛出 `ServletException` 或 `IOException`,需要在方法体中捕获并处理。这个方法的主要目的是在请求的生命周期中,提供了一个标准化的方式来添加额外的功能或安全检查。
阅读全文