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的新特性
- shiro重定向时URL中的JSESSIONID问题
- Apache Shiro去掉URL中的JSESSIONID
- Apache Shiro去掉URL中的JSESSIONID
- 去掉shiro登录时url里的JSESSIONID
- 去掉shiro登录时url里的JSESSIONID
- 去掉shiro登录时url里的JSESSIONID
- url中的jsessionid解释
- url中的jsessionid
- 过滤URL中的JSESSIONID
- url中的jsessionid解释
- url中的jsessionid解释
- url中的jsessionid解释
- url中的jsessionid所引起的问题和解决
- 关于url重定向的问题
- Java去掉 URL 中的 jsessionid
- 对于url出现jsessionid问题
- spring+shiro+cas的整合问题之循环重定向
- shiro整合cas多次验证或者重复重定向问题
- fmdb使用 小实例
- Java之学习笔记(8)-------------运算符和循环结构(流程控制)
- R语言常用包分类
- iOS开发中使用FMDB解决数据存储问题---(写的比较详细,仔细看,有很大的参考价值)
- java之学习笔记(9)---------------八大排序算法
- shiro重定向时URL中的JSESSIONID问题
- linux mysql 学习 (二)
- Java之学习笔记(10)-------------查找算法
- 获取视频网站上视频的缩略图以及其他信息
- Java之学习笔记(11)------------算法性能分析
- linux下杀死进程(kill)的N种方法 包括python–killproc
- 百度离线API获取坐标和添加标注
- Java之学习笔记(12)-----------数据类型转换valueOf、subString、indexOf用法
- mvn spring-boot:run 启动的应用有中文乱码的解决办法