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日

相关文章

  • 详解Spring极速集成注解redis实录

    详解Spring极速集成注解redis实录 前言 本文主要介绍Spring如何快速集成redis并使用注解方式进行操作。本教程需要你具备基本的Spring MVC框架的了解和redis的使用知识。 正文 一、引入redis依赖 在Spring项目中引入下面的redis依赖: <dependency> <groupId>org.spri…

    Java 2023年6月3日
    00
  • JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】

    JavaScript创建对象方式总结 在JavaScript中,我们可以使用多种方式来创建对象,包括工厂模式、构造函数模式、原型模式等。下面将针对每种方式进行详细讲解。 工厂模式 工厂模式是一种基本的对象创建方式,通过工厂函数来创建对象。这种方式可以避免重复代码,提高了代码的可复用性。 实现一个创建人物的工厂,示例代码如下: function createP…

    Java 2023年5月26日
    00
  • BootStrap Table 后台数据绑定、特殊列处理、排序功能

    Bootstrap Table 是一款基于 Bootstrap 样式的表格插件,它提供了丰富的功能如数据绑定、特殊列处理和排序功能等。在后台数据绑定方面,Bootstrap Table 提供了多种方式,包括本地(Local)、远程(Remote)和 URL,可以根据情况选择不同的方式。下面以远程方式为例进行讲解。 远程数据绑定 Bootstrap Table…

    Java 2023年6月15日
    00
  • 八、设置HTTP应答头

    设置HTTP应答头是Web开发中非常重要的一个过程,通过设置HTTP应答头,可以有效地控制浏览器的行为以及网站的运作。在本篇攻略中,我们将详细讲解设置HTTP应答头的步骤。 1.什么是HTTP应答头 HTTP应答头是HTTP请求中的一部分,用于告诉浏览器如何处理服务器发送的数据。HTTP应答头包含了很多有用的信息,例如文件类型、编码方式、缓存策略等。 2.设…

    Java 2023年6月16日
    00
  • layui+jquery支持IE8的表格分页方法

    下面为您详细讲解“layui+jquery支持IE8的表格分页方法”的完整攻略。 简介 Layui是一款轻量级的前端UI框架,兼容性良好,但官方仅支持IE10以上版本。有时候我们需要兼容低版本的IE浏览器,本文就是讲解使用layui+jquery实现支持IE8的表格分页方法。 准备工作 引入Layui和jquery库; 定义表格结构,设置表头等; 引入分页组…

    Java 2023年6月15日
    00
  • MyBatis还是JPA?终于有答案了

    我们来详细讲解“MyBatis还是JPA?终于有答案了”的完整攻略。 1. 背景介绍 在进行Java Web开发时,ORM框架是不可或缺的工具之一,其可以将Java对象映射到关系型数据库中。MyBatis和JPA是流行的ORM框架,那么如何选择呢? 2. MyBatis和JPA区别 2.1 MyBatis MyBatis是基于SQL语句的ORM框架,其与关系…

    Java 2023年5月19日
    00
  • Java8中方法引用的使用详解

    Java8中方法引用的使用详解 什么是方法引用? Java8中的方法引用是一种新特性,使用方法引用可以更加简洁的定义Lambda表达式。方法引用是指引用已经存在的方法而不是声明一个Lambda表达式来调用该方法。 方法引用的语法 方法引用的语法在箭头函数的基础上添加一个双冒号“::”,语法格式如下: object::instanceMethod ClassN…

    Java 2023年5月26日
    00
  • Springboot动态切换数据源的具体实现与原理分析

    下面开始讲解“Springboot动态切换数据源的具体实现与原理分析”的完整攻略。 一. 实现原理分析 1.1. 多数据源的实现方式 在多数据源的实现中,我们不能像单数据源的实现那样,在 application.properties 或 application.yml 中写入数据源的配置信息。我们需要寻找一种实现方式,能够在程序运行期间动态配置数据源信息。 …

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