public SecurityFilterChain filterChain(HttpSecurity http) { http // ... .securityContext((securityContext) -> securityContext .securityContextRepository(new RequestAttributeSecurityContextRepository()) ); return http.build(); }
时间: 2024-04-20 17:26:56 浏览: 105
这是一个Java配置类中的方法,用于配置Spring Security的过滤器链,并返回一个SecurityFilterChain对象。在该方法中,首先使用HttpSecurity对象的securityContext()方法配置了安全上下文,指定了使用RequestAttributeSecurityContextRepository作为安全上下文存储库。然后,使用HttpSecurity对象的build()方法返回一个SecurityFilterChain对象,表示配置完成。该过滤器链用于保护Web应用程序,并根据配置的规则对请求进行验证和授权。其中,安全上下文用于存储安全相关的信息,例如认证信息和授权信息等。
相关问题
SpringSecurity 5.7 的 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception 详解
在 Spring Security 中,SecurityFilterChain 是一个过滤器链条,负责对请求进行安全控制。在 Spring Security 5.7 中,SecurityFilterChain 的 filterChain 方法是用来创建这个过滤器链的。
该方法的参数 HttpSecurity 是用来配置安全控制的对象,也就是说,我们可以利用这个对象来添加一些安全控制相关的配置。例如:
```
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/private/**").authenticated()
.and()
.formLogin();
}
```
以上代码中,我们通过 `http.authorizeRequests()` 方法来配置请求授权规则(即哪些请求需要授权),然后通过 `http.formLogin()` 方法来配置登录认证相关的信息。
接下来,我们就来看一下 filterChain 方法的具体实现。该方法返回的是一个 SecurityFilterChain 对象,它包含了一个过滤器链条(即一个 FilterList 对象)。而这个过滤器链条中包含了多个过滤器,每个过滤器都负责不同的安全控制操作。
在 filterChain 方法中,Spring Security 会通过一系列的过滤器来完成安全控制。这些过滤器包括了:
- ChannelProcessingFilter:用来控制请求的协议类型(HTTP 或 HTTPS)。
- SecurityContextPersistenceFilter:用来持久化 SecurityContext 对象。
- ConcurrentSessionFilter:用来控制同一用户的并发登录会话数。
- LogoutFilter:用来处理用户退出登录相关的逻辑。
- UsernamePasswordAuthenticationFilter:用来处理基于表单的登录认证逻辑。
- RequestCacheAwareFilter:用来处理请求缓存相关的逻辑。
- SecurityContextHolderAwareRequestFilter:用来为请求添加 SecurityContextHolderAwareRequestWrapper 包装器,以便在请求中获取当前用户的安全上下文信息。
- AnonymousAuthenticationFilter:用来处理匿名用户的逻辑。
- SessionManagementFilter:用来管理用户的会话信息。
- ExceptionTranslationFilter:用来处理异常信息。
- FilterSecurityInterceptor:用来控制访问资源的权限。
在 filterChain 方法中,我们可以通过一系列的 `http.addFilterBefore(filter, beforeFilter)` 或 `http.addFilterAfter(filter, afterFilter)` 方法来添加自定义的过滤器,并且指定它们的位置。这样,我们就可以在 Spring Security 的过滤器链中添加我们自己的安全控制逻辑了。
http://www.jt.com/user/logout.html ,拦截.html后缀
你可以使用URL重写(URL Rewriting)技术来实现这个功能。具体实现方法如下:
1. 在web.xml文件中配置一个Filter,用于拦截以.html结尾的请求:
```
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
```
2. 编写UrlRewriteFilter类,实现doFilter方法:
```
public class UrlRewriteFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String path = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
if (path.endsWith(".html")) {
String newPath = path.substring(0, path.length() - 5);
RequestDispatcher dispatcher = request.getRequestDispatcher(newPath);
dispatcher.forward(request, response);
} else {
chain.doFilter(request, response);
}
}
// 其他方法
}
```
这样,当用户访问"http://www.jt.com/user/logout.html"时,UrlRewriteFilter会拦截请求并将其转发到"/user/logout"路径,然后通过servlet处理该路径的请求并执行相应的逻辑。
阅读全文