Springboot如何去掉URL后面的jsessionid

要去掉Spring Boot应用程序中URL后的JSESSIONID,可以在servlet过滤器中进行配置,具体步骤如下:

  1. 创建一个过滤器类,并实现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方法中获取到ServletRequestServletResponse对象。

接下来我们判断ServletRequest是否类型是HttpServletRequestServletResponse是否类型是HttpServletResponse,如果是则可以强制转换为这两种类型的对象。

我们在httpRequest对象中调用isRequestedSessionIdFromURL方法判断是否从URL中传递了JSESSIONID,如果是,我们将其从URL中删除,然后使用httpResponse.sendRedirect方法将其重定向到无JSESSIONID的URL。

  1. 配置过滤器
    在应用程序的主配置类中添加以下配置来注册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;
    }
}

在上面的代码中,我们使用DelegatingFilterProxyJSessionIdFilter注入到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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JAVA内部类示例详解及练习

    下面我就来详细讲解一下“JAVA内部类示例详解及练习”的完整攻略。 什么是Java内部类 Java内部类(Inner Class)指的是定义在另一个类中的类。Java内部类可以分为四种类型:成员内部类、静态内部类、局部内部类、匿名内部类。其中,成员内部类是最常用的一种形式。 成员内部类示例 下面通过一个示例来详解一下成员内部类的定义和使用: public c…

    Java 2023年5月23日
    00
  • MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码

    下面我将为你详细讲解使用Zookeeper保存数据库的配置并实现动态刷新的实现过程。本文主要分为以下几个部分: MyBatis使用Zookeeper保存数据库的配置的原理 实现动态刷新的流程 代码实现及示例说明 1. MyBatis使用Zookeeper保存数据库的配置的原理 MyBatis使用Zookeeper保存数据库的配置,可以将配置信息保存在Zook…

    Java 2023年6月16日
    00
  • 利用JWT如何实现对API的授权访问详解

    JWT是一种用于认证和授权的开放标准,常用于Web应用程序和API的身份验证和授权。使用JWT进行API的授权访问可以帮助我们更加安全和可控地管理API资源。 以下是使用JWT实现对API的授权访问的详细攻略: 步骤一:生成JWT Token 在每次请求API的时候,需要使用服务器端生成的JWT Token来进行身份认证和授权。通常可以使用jsonwebto…

    Java 2023年5月20日
    00
  • java显示当前的系统时间

    要在Java中显示当前的系统时间,我们可以使用java.util.Date和java.text.SimpleDateFormat类,以下是一个完整的攻略: 步骤1:导入类库 首先我们需要导入java.util.Date和java.text.SimpleDateFormat这两个类库。 import java.util.Date; import java.te…

    Java 2023年5月23日
    00
  • JAVA实现JSON后端向前端传递数据

    下面是详细讲解“JAVA实现JSON后端向前端传递数据”的完整攻略,包括以下内容: 引入JSON库 构造数据对象 将数据对象转化为JSON格式 向前端发送JSON格式数据 其中,步骤2和步骤3可以根据实际需求进行调整。 引入JSON库 Java中,我们可以使用第三方库来实现JSON格式数据的生成和解析,常用的库有GSON和Jackson。这里以GSON为例,…

    Java 2023年5月26日
    00
  • java struts2学习笔记之线程安全

    Java Struts2 学习笔记之线程安全攻略 什么是线程安全 在Java开发中,线程安全主要是指程序在多线程环境下能够正确、稳定地执行,并达到预期结果。 具体来说,在多线程环境下,如果有多个线程同时对共享资源进行访问和修改,那么就需要保证这些线程之间的并发执行是正确、稳定、安全的。 如果没有进行线程安全处理的话,可能会出现一些潜在的问题,例如: 竞态条件…

    Java 2023年5月20日
    00
  • Xml中使用foreach遍历对象实现代码

    下面就为你详细讲解使用foreach遍历对象实现代码的攻略。 1. 前置条件 在Xml中使用foreach遍历对象,需要先了解以下几点: XML – Extensible Markup Language(可扩展标记语言) foreach循环语句 如何通过XPath表达式获取XML节点 2. 步骤 2.1 导入XML文件 首先,需要将XML文件读取到程序中,可…

    Java 2023年5月19日
    00
  • FLASH 脚本代码大全

    FLASH 脚本代码大全 – 完整攻略 什么是 FLASH 脚本代码大全? FLASH 脚本代码大全是一本介绍 Adobe Flash 中 ActionScript 脚本编程语言常用代码的书籍,其中包含了许多实用的代码示例。对于 Flash 开发人员,这本书是十分重要的参考资料。 学习 FLASH 脚本代码大全的方法 1.按类别阅读代码示例 为了更好的理解示…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部