admin管理员组文章数量:1571327
最近开始在项目中使用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的新特性
本文标签: 重定向shiroJSESSIONIDurl
版权声明:本文标题:shiro重定向时URL中的JSESSIONID问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727690522a1125805.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论