利用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使用问题。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值