shiro重定向时URL中的JSESSIONID问题

来源:互联网 发布:python 查看字节 编辑:程序博客网 时间:2024/05/26 09:56

最近开始在项目中使用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

                @Overridepublic 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包装器

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


0 0