利用URL重写解决cookie禁用导致的sessionID问题
关于Cookie禁用的问题
上一篇文章已经提过,sessionID通过cookie保存在客户端,如果将cookie禁用,必将对session的使用造成一定的影响。而解决这个问题的办法是:URL重写
因为cookie在客户端最多只允许存储4K的数据,实际上只有3K的极限值,所以session的使用时不可避免的,而cookie的禁用对于session又是一个影响因素。
URL重写
1–servlet中涉及向客户端输出页面元素的时候,可以在相应的请求地址外面包上一层方法,也就是说使用response.encodeURL(“请求地址”);为请求地址添加一个JSESSIONID的值
2–servlet中涉及跳转到新的页面时,可以使用response.encodeRedirectURL(“请求地址”);为请求地址添加一个JSESSIONID的值
3–在jsp页面中,涉及到的请求地址,可以使用jstl标签中url的value属性进行设置
前提是需要导入两个jar包 jstl-1.2.jar 和 standard-1.1.2.jar
<%@ taglib prefix=“c” uri=“http://java.sun.com/jstl/core” %>
如:<a href=<c:url value=“encodeURL.action”></c:url>>encodeURL
4–在jsp页面中使用:<a href="<%=response.encodeURL(“encodeURL.action”)%>">encodeURL
关于HttpServletResponse的encodeRedirectURL()与encodeURL()的区别
共同点: 都对url附加上jsessionid参数进行了处理,如果需要,则在url的path后面附加上;jsessionid=xxx;如果不需要则直接返回传入的url。
不同点: encodeURL在附加jsessionid之前还对url做了判断处理:如果url为空字符串,则将url转换为完整的URL(http或https开头的);如果url是完整的URL,但不含任何路径(即只包含协议、主机名、端口,例如http://127.0.0.1),则在末尾加上根路径符号/。
即encodeURL如果进行了编码,则返回的URL一定是完整URL而不是相对路径;
而encodeRedirectURL则不对URL本身进行处理,只专注于添加jsessionid参数。
代码测试
生成并发送cookie
@WebServlet("/getCookie")
public class CookieServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("============Get请求===============");
// 设置格式
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
// 创建Cookie
Cookie cookie = new Cookie("java", "cookieDemo");
// 有效期,秒为单位
cookie.setMaxAge(3600);
// 设置cookie
response.addCookie(cookie);
response.getWriter().print("cookie创建成功");
response.sendRedirect("firse.jsp");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("============Post请求===============");
}
}
接收cookie:
@WebServlet("/sendCookie")
public class RequestCookieServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("============Get请求===============");
request.setCharacterEncoding("utf-8");
getCookie(request);
response.encodeRedirectURL("second.jsp");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void getCookie(HttpServletRequest request){
// 获取客户端cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
System.out.println(c.getName() + "--->" + c.getValue());
}
}
}
}
未禁用cookie时
- 获取cookie
- 二次请求发送cookie
- 后台显示
禁用cookie时
- 获取cookie
- cookie禁用后发送sessionID
利用URL重写可以解决cookie禁用时造成的session使用问题。