持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
WebView 使用 URL 后挂 JSESSIONID 访问 WEB 页面(URL 重写)
一个 Spring Boot 的项目,用的还是 JSP 来渲染页面,然后现在需要开发手机端。
手机端有原生的页面,但是现在大部分页面还是直接用 WebView 来访问原来的 WEB 页面。
WEB 页面倒是适配了手机端。
不过 WEB 页面是通过 SESSION 来验证身份的。
手机端用原生页面登录后,每次访问 WEB 页面时,先用 Token 获得一个 SESSION ID,再把这个 SESSION ID 挂到 URL 的后面访问 WEB 页面。
但是现有的项目不支持 URL;JSESSIONID=ABC123 这种形式,会提示下面的错误。
The request was rejected because the URL contained a potentially malicious String ";"
当然为了支持这种格式,可以改变现有的设定。 搜索到的作法,有的是在 Spring Boot 的 Websecurity 中配置 HttpFirewall 。
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowSemicolon(true);
return firewall;
}
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
}
不过这个项目如此设置之后,还是不能正常接收 JSEESIONID ,一直也没找到原因。 只能再寻找其它办法。
还有一点就是客户并不希望修改这个设置,只能继续搜索。
然后又想着用过滤器过滤过来的请求,把请求的 URL 后面的 JSESSIONID 设置到 Cookie 里,结果 HttpSevletRequest 无法直接设置 Cookie (太小白了)。
只有 HttpSevletResponse 可以设置 Cookie ,但是当前的 Response 都已经返回去了,这咋整。
然后继续搜索,原来可以直接重定向(还是太小白了),设置上 Cookie 之后,把当前的访问重定向一次,相当于让浏览器再访问一次当前的页面,这样就会带上刚才设置给 HttpSevletResponse 的 Cookie 了。
也就是 URL 重写了。
参考了下面帖子里的第三种方式:
jsessionid所引起的url分号问题 和解决 - 简书 (jianshu.com)
主要代码:
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
String sessionId= request.getParameter("JSESSIONID");
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath(request.getContextPath()); // 这个地方需要设置正确,在浏览器的开发者工具里能看到
response.addCookie(cookie);
redirectStrategy.sendRedirect(request, response, request.getServletPath());
不过在哪儿加这个处理呢?
还是得定义个过滤器共通处理一下。
主要代码:
@Component
public class SessionFilter extends OncePerRequestFilter {
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 上面 设定Session后重定向 的处理
}
}
这样就解决了上面说的问题。
结论就是 太小白了,一些基础的网络处理常识都不知道。