Springboot如何去掉URL后面的jsessionid

目录
  • 如何去掉URL后面的jsessionid
    • url中有Jsessionid生成的原因
    • 解决方式一
    • 解决方式二
  • Java关于jsessionid和URL
    • 对SEO的冲击
    • 安全问题
    • 解决之道

如何去掉URL后面的jsessionid

url中有Jsessionid生成的原因

jsessionid是标明session的id,它存在于cookie中,一般情况不会出现在url中,服务器会从客户端的cookie中取出来,但是如果客户端禁用了cookie的话,就要重写url了,显式的将jsessionid重写到Url中,方便服务器来通过这个找到session的id。

如果客户端请求的cookie中不包含JSESSIONID,服务端调用request.getSession()时就会生成并传递给客户端,此次响应头会包含设置cookie的信息

如果客户端请求的cookie中包含JSESSIONID,服务端调用request.getSession()时就会根据JSESSIONID进行查找对象,如果能查到就返回,否则就跟没传递JSESSIONID一样;

解决方式一

springBoot2.0之前版本

在 .yml配置文件中做如下配置

解决方式二

在启动类中继承SpringBootServletInitializer,然后重写这个方法 (此方法在springBoot2.0之前版本没有起作用,暂时做记录)

public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);

        // This will set to use COOKIE only
        servletContext.setSessionTrackingModes(
                Collections.singleton(SessionTrackingMode.COOKIE)
        );
        // This will prevent any JS on the page from accessing the
        // cookie - it will only be used/accessed by the HTTP transport
        // mechanism in use
        SessionCookieConfig sessionCookieConfig =
                servletContext.getSessionCookieConfig();
        sessionCookieConfig.setHttpOnly(true);
    }

Java关于jsessionid和URL

在写JSP程序时,经常发现url中有一个jsessionid参数,在刷新之后就消失了。一些人认为这是个一个BUG。

这不是一个bug。当一个新的session被创建时,server并不确定客户端是否支持cookies,所以它生成了一个cookie,就是URL中jsessionid的值。当客户端在第二次带着cookie返回时,服务器就知道jsessionid不是必须的,所以就会删掉它。如果客户端没有带着cookie返回,服务器就会继续在url中添加jsessionid参数。

但是现在几乎很难想象浏览器会不支持cookie。jsessionid参数也可能会给SEO和安全带来一定问题。

对SEO的冲击

有些搜索引擎可能会惩罚(找不到更好的词形容)那些具有多个不同url但内容相同的网站。因为sessionid是唯一的,所以多个搜索机器人将返回相同的内容但url不同。

这是一个严重的问题。我们试一下用google搜索inurl:;jsessionid,Google的搜索结果:About 211,000,000 results (0.25 seconds)

安全问题

在url中包含sessionId不是一个明智之举,这将为攻击者提供便利。

解决之道

不幸的是Servlet Specification和Servlet Containers中并未提供一个标准的方法去禁止在url中带jsessionid。

不过我们可以通过servlet filter去解决这个问题。

package com.lgete.web.filter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * @author Zhu Jia <a
 *         href="mailto:zhujia7895@gmail.com" rel="external nofollow" >zhujia7895@gmail.com</a>
 *
 */
public class URLSessionFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        if (!(request instanceof HttpServletRequest)) {
            chain.doFilter(request, response);
            return;
        }

        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(
                httpResponse) {
            public String encodeRedirectUrl(String url) {
                return url;
            }

            public String encodeRedirectURL(String url) {
                return url;
            }

            public String encodeUrl(String url) {
                return url;
            }

            public String encodeURL(String url) {
                return url;
            }
        };
        chain.doFilter(request, wrappedResponse);
    }

    public void init(FilterConfig filterConfig) {
    }
    public void destroy() {
    }
}

在web.xml中添加以下内容:

<filter>
    <filter-name>URLSessionFilter</filter-name>
    <filter-class>zj.web.filter.URLSessionFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>URLSessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot 定制URL匹配规则的方法

    事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后来发现这是Spring Boot路由规则.好了,有废话了下,那么看看我们解决上面这个导致的问题. 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符".",这种情况在Spring中可以称之为"定界符定义的格式&q

  • 浅谈SpringBoot处理url中的参数的注解

    1.介绍几种如何处理url中的参数的注解 @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写 (1)PathVaribale 获取url中的数据 看一个例子,如果我们需要获取Url=localhost:8080/hello/id中的id值,实现代码如下: @RestController public class Hello

  • SpringBoot2.x版本中,使用SpringSession踩的坑及解决

    SpringBoot2.x SpringSession踩坑 Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.Ses

  • 解决springboot中配置过滤器以及可能出现的问题

    在springboot添加过滤器有两种方式: 1.通过创建FilterRegistrationBean的方式(建议使用此种方式,统一管理,且通过注解的方式若不是本地调试,如果在filter中需要增加cookie可能会存在写不进前端情况) 2.通过注解@WebFilter的方式 通过创建FilterRegistrationBean的方式创建多个filter以及设置执行顺序: 1.创建两个实现Filter接口的类TestFilter1 .TestFilter2 package com.aoxun.c

  • Springboot如何去掉URL后面的jsessionid

    目录 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 解决方式一 解决方式二 Java关于jsessionid和URL 对SEO的冲击 安全问题 解决之道 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 jsessionid是标明session的id,它存在于cookie中,一般情况不会出现在url中,服务器会从客户端的cookie中取出来,但是如果客户端禁用了cookie的话,就要重写url了,显式的将jsessionid

  • nginx proxy_pass反向代理配置中url后加不加/的区别介绍

    前言 nginx作为web服务器一个重要的功能就是反向代理.nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. 而在日常的web网站部署中,经常会用到nginx的proxy_pass反向代理,有一个配置需要弄清楚:配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走(这样配置可以参考这篇文章). 下面举个小实

  • JS Promise axios 请求结果后面的.then() 是什么意思

    目录 Promise 对象 Promise 对象的状态 回调函数 Promise.then() 绑定回调函数 使用 Promise:链式调用 链式调用的实现 错误处理 常见错误 创建 Promise 对象 Promise 其他静态方法 创建已决议的 Promise 对象 多个 Promise 对象 结语&参考文献 Promise 是JS中一种处理异步操作的机制,在现在的前端代码中使用频率很高.Promise 这个词可能有点眼生,但你肯定见过 axios.get(...).then(res =>

  • vue项目如何去掉URL中#符号的方法

    目录 前言 正常解决步骤 1. 设置路由mode 2. 配置服务端nginx 可能碰到的问题 1. 静态资源Uncaught SyntaxError: Unexpected token < 问题 2. api接口请求404问题 3. 开发环境(npm run dev启动)刷新404的问题 4. 前端路由与服务端接口路由冲突问题 结尾 前言 最近,同事跟我说,项目的访问路径里的/#/挺不美观的,就下手尝试去掉,本以为就是一句代码搞定的事情,结果遇到不少问题. 现在把我遇到的情况记录下来,做个存档,

  • python抽取指定url页面的title方法

    今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,xpath在完成这样的小任务上效率非常好,在这里之所以又使用了一下正则表达式是因为xpath在处理一些特殊的页面的时候会出现乱码的情况,当然这不是xpath的原因,而是页面本身编码,跟utf-8转码之间有冲突所致,这里看代码: # !/usr/bin/python #-*-coding:utf-8-*- ''' 功能:抽取指定url的页面内容中的title '

  • Sql Server 如何去掉内容里面的Html标签

    分享一个方法,去掉内容里的Html标签,测试数据: DECLARE @str NVARCHAR(max)=' <!DOCTYPE html> <html> <head> </head> <body> <div>哈哈哈</div> </body> </html> ' 方法如下: CREATE FUNCTION [dbo].[removehtml] (@str NVARCHAR(MAX)) RETURN

  • laravel框架实现去掉URL中index.php的方法

    1.将框架根目录下的server.php文件重命名为index.php 2.将框架根目录下的文件夹public下的.htaccess文件复制到框架根目录下,与index.php处于同一目录 3.修改Apache的httpd.conf文件 1.httpd.conf文件所在路径\bin\apache\apache2.4.23\conf\httpd.conf,例如,我的电脑中httpd.conf路径为:D:\wamp\bin\apache\apache2.4.23\conf\httpd.conf 找到

  • Vue Router去掉url中默认的锚点#

    hash模式url vue-router默认hash模式--使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载. 如果不想要这种默认的hash模式,可以用路由的history模式,这种模式充分的利用history.pushState API来完成URL跳转而无需重新加载页面. index.js Vue.use(Router) export default new Router({ mode: 'history', routes: [ { path:"/xxx&quo

  • vue.js路由mode配置之去掉url上默认的#方法

    比如 : http://localhost:8080/#/login 路由中间默认带有 # 如果需要去掉#,只需将mode的默认值'hash'改为'history'即可. router.js : import Router from 'vue-router' import routers from './routers' export default () => { return new Router({ routers, mode: 'history' // 加上这个配置项,url默认的 #

  • 解决SpringBoot打成jar运行后无法读取resources里的文件问题

    开发一个word替换功能时,因替换其中的内容功能需要 word 模版,就把 word_replace_tpl.docx 模版文件放到 resources 下 在开发环境中通过下面方法能读取word_replace_tpl.docx文件,但是打成jar包在 linux下运行后无法找到文件了 File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/office_template/xxx.docx&q

随机推荐