shiro重定向时URL中的JSESSIONID问题

最近开始在项目中使用shiro作为权限控制,配置成功后,访问一切正常。但发现在向登录页面重定向时,URL中总是带;JSESSIONID=****,这时Session的另一种使用方式(一种是Cookie)。本来也不影响使用,但是据说这种方式有漏洞,再就是这样看着实在是不爽。那怎么去掉呢?

第一步:刚开始我以为是tomcat的问题,于是就百度了下tomcat怎么取消url中的JSESSIONID。

https://fralef.me/tomcat-disable-jsessionid-in-url.html。因为使用的是tomcat7,于是在wen.xml中配置

<session-config>
     <tracking-mode>COOKIE</tracking-mode>
</session-config>

也自定义配置了listener,但是怎么弄都没用

servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

解决不了问题后,我在想可能不是tomcat的问题,于是想是在重定向时出现问题,那应该问题是在javax.servlet.http.HttpServletResponseWrapper.encodeRedirectURL方法时的问题,就开始debug找找问题的根源。

第二步:一步一步找到了问题

1、org.apache.shiro.web.filter.AccessControlFilter.redirectToLogin(ServletRequest, ServletResponse)

2、org.apache.shiro.web.util.RedirectView.sendRedirect(HttpServletRequest, HttpServletResponse, String, boolean)

protected void sendRedirect(HttpServletRequest request, HttpServletResponse response,
                                String targetUrl, boolean http10Compatible) throws IOException {
        if (http10Compatible) {
            // Always send status code 302.
            response.sendRedirect(response.encodeRedirectURL(targetUrl));
        } else {
            // Correct HTTP status code is 303, in particular for POST requests.
            response.setStatus(303);
            response.setHeader("Location", response.encodeRedirectURL(targetUrl));//<span style="color:#ff0000;">这里调用了<span style="font-family: Arial, Helvetica, sans-serif;">response.encodeRedirectURL</span></span>

        }
    }
public String <span style="color:#ff0000;">encodeRedirectURL</span>(String url) {
        if (isEncodeable(toAbsolute(url))) {
            return toEncoded(url, request.getSession().getId());
        } else {
            return url;
        }
    }
protected String <span style="color:#ff0000;">toEncoded</span>(String url, String sessionId) {

        if ((url == null) || (sessionId == null))
            return (url);

        String path = url;
        String query = "";
        String anchor = "";
        int question = url.indexOf('?');
        if (question >= 0) {
            path = url.substring(0, question);
            query = url.substring(question);
        }
        int pound = path.indexOf('#');
        if (pound >= 0) {
            anchor = path.substring(pound);
            path = path.substring(0, pound);
        }
        StringBuilder sb = new StringBuilder(path);
        if (sb.length() > 0) { // session id param can't be first.
            sb.append(";");
            sb.append(DEFAULT_SESSION_ID_PARAMETER_NAME);//<span style="color:#ff0000;">在这里加入了JSESSIONID</span>
            sb.append("=");
            sb.append(sessionId);
        }
        sb.append(anchor);
        sb.append(query);
        return (sb.toString());

    }

这样就明白问题出在哪里了。于是自定义MyShiroHttpServletResponse继承ShiroHttpServletResponse,覆写encodeRedirectURL直接返回url

                @Override
		public String encodeRedirectURL(String url) {
			// return super.encodeRedirectURL(url);
			return url;
		}
                @Override
<span style="white-space:pre">		</span>public String encodeURL(String url) {
<span style="white-space:pre">			</span>// return super.encodeURL(url);
<span style="white-space:pre">			</span>return url;
<span style="white-space:pre">		</span>}
在org.apache.shiro.web.servlet.ShiroFilter中覆写wrapServletResponse方法,返回自定的ServletResponse包装器

                @Override
		protected ServletResponse wrapServletResponse(HttpServletResponse orig, ShiroHttpServletRequest request) {
			// TODO Auto-generated method stub
			// return super.wrapServletResponse(orig, request);
			return MyShiroHttpServletResponse(orig, getServletContext(), request);
		}
问题解决了,也在过程中学习了servlet3的新特性


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值