请求路径上带有或出现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标签集成一个内部的简单的单点登录功能时,场景给大家描述一下:

1.请求A换取票据
2.A系统返回票据给浏览器
3.通过iframe标签请求B系统
4.B系统校验票据赋予登录成功的session
浏览器
A系统
B系统

如果各位看官觉得我的理解不准确,可以多查查资料自行了解下,欢迎在评论里对我提出宝贵的意见.

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值