要去掉Spring Boot应用程序中URL后的JSESSIONID,可以在servlet过滤器中进行配置,具体步骤如下:
- 创建一个过滤器类,并实现
javax.servlet.Filter
接口。
@Component
public class JSessionIdFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (request instanceof HttpServletRequest
&& response instanceof HttpServletResponse) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 从URL中移除JSESSIONID
if (httpRequest.isRequestedSessionIdFromURL()) {
String url = httpRequest.getRequestURI();
String session = httpRequest.getRequestedSessionId();
url = url.replaceAll(";jsessionid=" + session, "");
httpResponse.sendRedirect(url);
return;
}
}
chain.doFilter(request, response);
}
}
在上面的代码中,我们将javax.servlet.Filter
接口实现为JSessionIdFilter
类,并从doFilter
方法中获取到ServletRequest
和ServletResponse
对象。
接下来我们判断ServletRequest
是否类型是HttpServletRequest
,ServletResponse
是否类型是HttpServletResponse
,如果是则可以强制转换为这两种类型的对象。
我们在httpRequest
对象中调用isRequestedSessionIdFromURL
方法判断是否从URL中传递了JSESSIONID
,如果是,我们将其从URL中删除,然后使用httpResponse.sendRedirect
方法将其重定向到无JSESSIONID
的URL。
- 配置过滤器
在应用程序的主配置类中添加以下配置来注册JSessionIdFilter
:
@Configuration
public class AppConfig {
@Bean
public FilterRegistrationBean<JSessionIdFilter> jsessionIdFilter() {
FilterRegistrationBean<JSessionIdFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new JSessionIdFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("JSessionIdFilter");
registrationBean.setOrder(1);
return registrationBean;
}
}
在上面的代码中,我们使用@Configuration
注解标记该类,将其注册为Spring的一个配置类。
我们使用@Bean
注解将JSessionIdFilter
添加到应用程序中,并设置过滤器的名称为“JSessionIdFilter”和优先级为1。
我们并使用addUrlPatterns
方法来设置过滤器的匹配规则,这里设置为“/*”,表示匹配所有的URL。
示例一:
假设我们有一个Spring Boot应用程序,它的上下文路径为“/myapp”。我们将其部署到一个Web服务器上,并将其公开为“http://localhost:8080/myapp”URL。如果用户在URL中传入JSESSIONID
,比如“http://localhost:8080/myapp;jsessionid=xyz”,那么我们希望自动将其重定向到“http://localhost:8080/myapp”URL,那么可以使用上述方法进行配置。
示例二:
我们在Spring MVC应用程序中使用了注解驱动,这意味着我们的请求映射不仅可以使用传统的Controller和RequestMapping注解,还可以使用@GetMapping、@PostMapping和其他各种注解。在这种情况下,我们可以通过将JSessionIdFilter
注册在DelegatingFilterProxy
的代理中,来使其与注解驱动一起使用,示例如下:
@Configuration
public class AppConfig {
@Bean
public FilterRegistrationBean<DelegatingFilterProxy> delegatingFilterProxy() {
FilterRegistrationBean<DelegatingFilterProxy> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new DelegatingFilterProxy("springSecurityFilterChain"));
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean<JSessionIdFilter> jsessionIdFilter() {
FilterRegistrationBean<JSessionIdFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new JSessionIdFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("JSessionIdFilter");
registrationBean.setOrder(2); // 这个过滤器执行的顺序比上一个要晚
return registrationBean;
}
}
在上面的代码中,我们使用DelegatingFilterProxy
将JSessionIdFilter
注入到Spring Security代理中。这使得我们可以使用该过滤器配置来删除URL中的JSESSIONID
,该过滤器也可以与注解驱动一起使用,确保 URL 中不会出现 JSESSIONID
。
这里提一下,若项目使用Spring Security配置了API的鉴权,JSESSIONID是通过cookie而非URL来传递的,上述过滤器可能无法完全达到预期效果。这时需要通过配置httpSession
来禁用URL传递,代码示例如下:
@Configuration
public class HttpSessionConfig extends HttpSessionConfigurerAdapter {
@Override
public void configure(HttpSessionSecurityContextRepository sessionRepository) {
sessionRepository.setAllowSessionIdInUrl(false);
}
}
以上就是Spring Boot如何去掉URL后面的JSESSIONID
的详细攻略,希望对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot如何去掉URL后面的jsessionid - Python技术站