请求路径上带有或出现jsessionid的处理办法
问题示例
请求路径中带有;jsessionid=xxx
等字符串:
示例如下:
http://localhost:8089/;jsessionid=72E275DDDD4FFC3FBDCAB91BF5108B37template/templateList?pageSize=10&pageNum=1&title=&parentId=0
还有的情况是;jsessionid=xxx
出现在了请求的末尾.
解决办法
先将请求中的字符串;jsessionid=xxx
替换为空字符串,然后请求转发.核心代码:
//过滤路径中带 ;jsessionid=003EC21DCDFA5169409DB58EE39C0896 的问题
String requestURI = request.getRequestURI();
if (requestURI.indexOf(";jsessionid=") != -1) {
//替换掉路径上的内容, ;jsessionid=003EC21DCDFA5169409DB58EE39C0896
requestURI = requestURI.replace(";jsessionid=" + session.getId(),"");
//重定向一下
request.getRequestDispatcher(requestURI).forward(request, response);
return false;
}
下面具体实现该方式:
一.新建拦截器或过滤器,项目中已有拦截器或者过滤器的,想复用也可以
我这里用的是拦截器.
新建拦截器,并重写preHandle
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException, ServletException {
二.在拦截器preHandle
方法中进行处理
代码即核心代码,如下:
//过滤路径中带 ;jsessionid=003EC21DCDFA5169409DB58EE39C0896 的问题
String requestURI = request.getRequestURI();
if (requestURI.indexOf(";jsessionid=") != -1) {
//替换掉路径上的内容, ;jsessionid=003EC21DCDFA5169409DB58EE39C0896
requestURI = requestURI.replace(";jsessionid=" + session.getId(),"");
//重定向一下
request.getRequestDispatcher(requestURI).forward(request, response);
return false;
}
强调!!!一定要return false
,不然这个请求实际上是被放行了,也就导致了404报错.而return false
后,请求会在在这段代码处理后,变成了正确的路径,重新走一遍服务端,这样操作后,你会发现前端页面控制台虽然还是那种错误路径,但是已经能正确得到响应,获取到数据了.
问题诱因
通过查资料及整理,我的理解是,浏览器与服务端交互默认带有session,而某些操作或设计导致浏览器第一次
与服务端交互时没有相应的session留存在服务端,这时候,服务端会补一个session留存,而这个动作会导致浏览器的http请求拼接一串含有jsessionid的字符串到路径上,导致了该问题.
说到这里,我的问题发生于我通过iframe标签集成一个内部的简单的单点登录功能时,场景给大家描述一下:
如果各位看官觉得我的理解不准确,可以多查查资料自行了解下,欢迎在评论里对我提出宝贵的意见.