Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >火狐浏览器显示“已阻止载入混合活动内容“的解决方法

火狐浏览器显示“已阻止载入混合活动内容“的解决方法

作者头像
全栈程序员站长
发布于 2021-11-08 06:05:10
发布于 2021-11-08 06:05:10
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

从 Firefox 18 开始,如果 HTTPS 页面中包含非加密的 HTTP 内容,浏览器会在控制台输出警告,记录 Mixed Active Content 请求。而从 Firefox 23 开始,浏览器会默认阻止 HTTPS 页面中可能影响网页安全的 HTTP 请求(即阻止 Mixed Active Content)。这样做会牺牲一些网站的兼容性,但对安全性的提高是很有帮助的。

获取 Mixed Content 相当于发起部分加密的连接,其中未加密的部分存在被中间人攻击的可能。不同类型的 Mixed Content 所产生的危害程度也有所不同,Mixed Passive Content 可能会使中间人获取到用户的设备信息,或让用户看到不正确的图片、音频等信息。而 Mixed Active Content 则可能导致用户的敏感数据被窃取,比如账号密码等。

为什么 Mixed Content Blocker 不是阻止所有的 HTTP 请求?

Mixed Content 可以分为两类:

Mixed Passive Content

Mixed Active Content

Mixed Passive Content (a.k.a. Mixed Display Content)

Mixed Passive Content 是在 HTTPS 页面中一些对安全性影响不大的 HTTP 内容,比如 Image、Audio、Video 等。即使这些内容被中间人篡改,所产生的影响也只是 —— 中间人得知了用户的浏览器信息 (through user-agent included by HTTP headers)、用户看到了一张不正确的图片,这些被篡改的内容无法修改 DOM 树,也无法执行。另外,Mixed Passive Content 在 Web 上普遍存在。因此 Firefox 默认不会阻止 Mixed Passive Content。

Mixed Active Content (a.k.a. Mixed Script Content)

Mixed Active Content 是在 HTTPS 页面中一些能够修改 DOM 树的 HTTP 内容,如 JavaScript、CSS、XMLHttpRequest、iFrame 等。这些 HTTP 内容被中间人修改以后,可能会影响原有 HTTPS 内容的安全性,导致敏感的用户数据被盗。因此 Firefox 会默认阻止 Mixed Active Content。

深入思考

为什么 Frame 应该是 Mixed Active Content?

Frame 之所以不能被分类为 Mixed Passive Content 主要有以下几个原因:

一个 frame 可以将外层可靠的 HTTPS 页面跳转到恶意盗取信息的仿造页面。

如果一个 HTTPS 页面嵌套着 HTTP frame,而这个 frame 包含表单用以输入用户信息,那么用户信息将会以 HTTP 方式传送,有被中间攻击者窃取的危险,而用户却毫不知情,还以为一切都在安全的 HTTPS 里。

如何判定 Mixed Content 是 Active 还是 Passive?

该 Mixed Content 是否会影响页面的 DOM 结构。(Yes -> Active, No -> Passive)

解决方案:

如果页面中包含了如 JavaScript、CSS、XMLHttpRequest、iFrame 等这些 HTTP 内容。

使用相对链接

修改http链接为https(需要连接支持https)

让浏览器自动判断http访问还是https访问 比如 <img src=”//www.sslzhengshu.com/statics/images/logo1.jpg” />

方案二:

最近在主导公司网站进行全站Https改造工作,本文记录在改造过程中遇到的一个由于后端302跳转导致前端浏览器阻止访问的问题,感觉这样的问题有一定通用性,所以编辑成文,希望能给遇到类似问题的人们有所帮助。

问题复现

经过一段时间的调研工作,终于将公司的环境改造成支持https访问模式,信心满满的打开公司测试环境主页,https://test.xxx.com。一切正常,就在我以为改造工作就要完成的时候,问题就出现了。

进入主页正常,输入用户名和密码登录,页面就不动了。调出Firefox的控制台查看,发现这么一行报错。

(图一)

打开网络面板查看得到如下内容

(图二)

前端发起了一个https的Ajax请求,后端返回状态码为302,location为http://开头网址,这样就造成了混合访问。本应该有Ajax自动处理的302跳转就这样被浏览器禁止了。

问题分析

1. 什么是混合内容

当用户访问使用HTTPS的页面时,他们与web服务器之间的连接是使用SSL加密的,从而保护连接不受嗅探器和中间人攻击。

如果HTTPS页面包括由普通明文HTTP连接加密的内容,那么连接只是被部分加密:非加密的内容可以被嗅探者入侵,并且可以被中间人攻击者修改,因此连接不再受到保护。当一个网页出现这种情况时,它被称为混合内容页面。

详情可见https://developer.mozilla.org…

2. 为什么经过后端跳转后Location由https变为了http。

我们后端采用Java开发,部署与Tomcat,对于Servlet来说一般采用HttpServletResponse.sendRedirect(String url) 方法实现页面跳转(302跳转)。那么问题是不是出在这个方法呢?答案是否定的。 sendRedirect(String url)方法中url参数可以传入绝对地址和相对地址。我们使用的时候一般传入相对地址,这样由方法内部自动转换为绝对地址也就是返回给浏览器中Location参数中的地址,sendRedirect()方法内部会根据当前访问的scheme来决定拼接后绝对地址的scheme,也就是说如果访问地址是https开头那么跳转链接的绝对地址也会是https的,http同理。在本次实例中我们传入的就是相对地址,跳转链接的绝对路径地址开头是由请求地址决定的,也就是后端程序收到的HttpServletRequest请求协议一定是http开头的。

我们看到(图二)中地址请求地址是由https开头的,为什么到了后端程序后就成为了http请求呢?我们接着往下说。

(图三)

为了方便说明我画了一张https配置的架构图,我们使用Nginx作为反向代理服务器,上游服务器使用Tomcat,我们在Nginx层进行Https配置,由Nginx负责处理Https请求。但是Nginx自身处理方式规定向上游服务器发送请求的时候是以http的方式请求的。这也就说明了为什么我们后端代码收到的请求是http协议,真想终于大白了。

解决方法

问题终于明了了,接下来就是解决的时候。

1.解决方案1.0

既然经过Nginx代理后Tomcat服务器运行的代码都变成了http请求,然后sendRedirect方法传入相对地址就会随着请求地址也变成http。那么我们不再使用相对地址而使用绝对地址。这样跳转地址就全部由我们做主,想跳转到哪里就跳转的哪里,妈妈再也不用担心我们跳转了。

先期改造:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 重新实现sendRedirect。
     * @param request
     * @param response
     * @param url
     * @throws IOException
     */
    public static void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException{
        if(url.startsWith("http://")||url.startsWith("https://")){
            //绝对路径,直接跳转。
            response.sendRedirect(url);
            return;
        }
        // 收集请求信息,为拼接绝对地址做准备。
        String serverName = request.getServerName();
        int port = request.getServerPort();
        String contextPath = request.getContextPath();
        String servletPath = request.getServletPath();
        String queryString = request.getQueryString();

        // 拼接绝对地址
        StringBuilder absoluteUrl = new StringBuilder();
        // 强制使用https
        absoluteUrl.append("https").append("://").append(serverName);
        //80和443位http和https默认接口,无需拼接。
        if (port != 80 && port != 443) {
            absoluteUrl.append(":").append(port);
        }
        if (contextPath != null) {
            absoluteUrl.append(contextPath);
        }
        if (servletPath != null) {
            absoluteUrl.append(servletPath);
        }
        // 将相对地址加入。
        absoluteUrl.append(url);
        if (queryString != null) {
            absoluteUrl.append(queryString);
        }
        // 跳转到绝对地址。
        response.sendRedirect(absoluteUrl.toString());
    }
代码语言:javascript
代码运行次数:0
运行
复制

我们自己了一个sendRedirect()方法,但是还有一点小小的瑕疵,我们将所有相对地址都转化成http开头的绝对地址,对于那些我们即支持https由支持http的网站来说,这样就不适合了,所以我们需要和前端请求做一个预定,让前端再发类似于Ajax访问的时候,自定义一个request的header,告诉我们是https访问还是http访问,我们在后端代码中判断这个自定义header,决定代码行为。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 重新实现sendRedirect。
     * @param request
     * @param response
     * @param url
     * @throws IOException
     */
    public static void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException{
        
        
        if(url.startsWith("http://")||url.startsWith("https://")){
            //绝对路径,直接跳转。
            response.sendRedirect(url);
            return;
        }
        
        //假设前端请求头为http_https_scheme,可以传入的值有http或https,不传默认为https。
        if(("http").equals(request.getHeader("http_https_scheme"))){
            //http请求,默认行为。
            response.sendRedirect(url);
            return;
        }
        
        // 收集请求信息,为拼接绝对地址做准备。
        String serverName = request.getServerName();
        int port = request.getServerPort();
        String contextPath = request.getContextPath();
        String servletPath = request.getServletPath();
        String queryString = request.getQueryString();

        // 拼接绝对地址
        StringBuilder absoluteUrl = new StringBuilder();
        // 强制使用https
        absoluteUrl.append("https").append("://").append(serverName);
        //80和443位http和https默认接口,无需拼接。
        if (port != 80 && port != 443) {
            absoluteUrl.append(":").append(port);
        }
        if (contextPath != null) {
            absoluteUrl.append(contextPath);
        }
        if (servletPath != null) {
            absoluteUrl.append(servletPath);
        }
        // 将相对地址加入。
        absoluteUrl.append(url);
        if (queryString != null) {
            absoluteUrl.append(queryString);
        }
        // 跳转到绝对地址。
        response.sendRedirect(absoluteUrl.toString());
    }
代码语言:javascript
代码运行次数:0
运行
复制

以上为改造之后的代码,增加了请求头判断逻辑。这样我们的方法就支持http和https混合模式了。


更进一步: 让我们对上面的代码更进一步,其实我们就是对sendRedirect的逻辑重新编排,只不过我们使用的静态方法的模式,可不可以直接重写response中的sendRedirect()方法?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** * 重写sendRedirect方法。 * */ public class HttpsServletResponseWrapper extends HttpServletResponseWrapper { private final HttpServletRequest request; public HttpsServletResponseWrapper(HttpServletRequest request,HttpServletResponse response) { super(response); this.request=request; } @Override public void sendRedirect(String location) throws IOException { if(location.startsWith("http://")||location.startsWith("https://")){ //绝对路径,直接跳转。 super.sendRedirect(location); return; } //假设前端请求头为http_https_scheme,可以传入的值有http或https,不传默认为https。 if(("http").equals(request.getHeader("http_https_scheme"))){ //http请求,默认行为。 super.sendRedirect(location); return; } // 收集请求信息,为拼接绝对地址做准备。 String serverName = request.getServerName(); int port = request.getServerPort(); String contextPath = request.getContextPath(); String servletPath = request.getServletPath(); String queryString = request.getQueryString(); // 拼接绝对地址 StringBuilder absoluteUrl = new StringBuilder(); // 强制使用https absoluteUrl.append("https").append("://").append(serverName); //80和443位http和https默认接口,无需拼接。 if (port != 80 && port != 443) { absoluteUrl.append(":").append(port); } if (contextPath != null) { absoluteUrl.append(contextPath); } if (servletPath != null) { absoluteUrl.append(servletPath); } // 将相对地址加入。 absoluteUrl.append(location); if (queryString != null) { absoluteUrl.append(queryString); } // 跳转到绝对地址。 super.sendRedirect(absoluteUrl.toString()); } }

具体逻辑一样,我们只是继承了HttpServletResponseWrapper 这个包装类,在这里使用了一个观察者模式重新编写了sendRedirect()方法逻辑。 我们可以这样使用我们自定义等HttpsServletResponseWrapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String location="/login";
        new HttpsServletResponseWrapper(request, response).sendRedirect(location);

    }

再进一步:

既然我们有了新的HttpServletResponseWrapper ,我们在需要的地方手动包装HttpServletResponse 就显得有点多余了。我们可以利用servletfilter机制来自动包装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HttpsServletResponseWrapperFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            chain.doFilter(request, new HttpsServletResponseWrapper((HttpServletRequest)request, (HttpServletResponse)response));

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

}
代码语言:javascript
代码运行次数:0
运行
复制

在web.xml中设置filter映射,可以直接使用HttpServletResponse 对象,无需包装,因为在请求经过HttpsServletResponseWrapperFilter 的时候response已经被包装为HttpsServletResponseWrapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String location="/login";
        response.sendRedirect(location);

    }

至此,我们已经代码逻辑无缝的嵌入到我们的后端代码中,看上去更优雅了。

2.解决方案2.0

在1.0版本中我们的关注点都是Nginx上游服务中运行的后端代码,我们通过对代码的改造达到我们的目的。现在我们转换一下思路,将关注点放在Nginx上,既然是Nginx代理之后,我们的scheme丢失,那么Nginx有没有给我们提供一种机制保留代理之后的scheme呢,答案是肯定的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location / {
    proxy_set_header X-Forwarded-Proto $scheme;
}

一行简单的配置,就解决了我们的问题,Nginx在代理的时候保留了scheme,这样我们在跳转的时候可以直接使用HttpServletResponse.sendRedirect()方法。

小结

通过解决方案1.0的修改代码方式和2.0的修改配置方式,我们都解决了问题。在日常开发中解决问题的方式很多,只要你了解产生问题的原理,在产生问题的任意环节都可以寻求解决方案。这篇工作记录就写到这里,当然这个问题还有其他的解决方式,如果你有其他的解决方案可以留言告诉我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaWeb(七)之详解JavaWeb路径
前言   在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的。那这一篇我给大家详细的分享一下Web中的各种路径问题。   世界上一切东西都是相对的,对于这点而言,相信大家并不陌生,由于这篇文章是针对于WEB阶段来讲的,所以以下绝对路径和相对路径都是针对于整个互联网而言的。   在JavaWeb中需要写的路径大概分为四大类:     1)客户端路径       超链接、表单、重定向     2)服务端路径       转发、包含     3)获取资源路径       servlet
用户1195962
2018/01/18
2K0
JavaWeb(七)之详解JavaWeb路径
JavaWeb项目(四)
(1)在用户模块下的\WEB-INF\pages\system\user\list.jsp页面中找到角色按钮,对应的点击事件和函数的绑定都已完成,roleList方法中向后台UserServelt发送请求,执行userRoleList方法,传递参数用户id
楠羽
2022/11/18
6440
JavaWeb项目(四)
【愚公系列】2023年04月 Java面面刷题系统-004.登录和权限校验
1、找到项目webapp/login.jsp登陆页面,修改form表单提交的action路径
愚公搬代码
2023/04/06
5070
Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目
Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 图片 每博一文案 有句谚语说:“一怒之下踢石头,只有痛着脚趾头。” 比一件糟糕的事情更可拍的,是你用糟糕的态度去面对它。看过一个很有意思的故事: 有个男人清早洗漱的时候,把自己的手表放在了桌子上。他的儿子不小心把手表碰倒地上摔坏了,男人 气得儿子揍了一顿,还埋怨妻子没看好儿子,两个人吵了起来。 男人气急败坏地摔门出去,路上想起有一份重要文件忘记带了,他匆忙回家取。可没有人在家, 他只得打电话让妻子回来送钥匙。妻子赶回家时,不小心撞翻
RainbowSea
2023/04/10
4370
request对象详解
请求对象:封装了请求头信息,请求体信息等 .1:特点:类型:HttpServletRequest 2:生命周期: 诞生:客户端浏览器每次发出请求,都会创建一个响应对象。 销毁:服务方法执行完毕就会销毁 .3:请求对象的作用: a:作为域对象使用 .b:能够获得请求头信息 .c:获得其他的信息的API方法 .d:获得请求参数: e:请求转发和请求包含: 作用:
全栈程序员站长
2022/09/06
5320
request对象详解
Servlet学习笔记6(request请求对象、response响应对象2)
重定向的特点: <1>浏览器地址栏发生变化 <2>发送了两次请求,都是由浏览器发送的请求 重定向的路径:由于是浏览器发送的请求,所以路径必须要带项目名称, 比如:/chapter04/welcome.html; 3.HttpServletRequest请求对象 HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用 的是带协议的请求对象。 请求消息:请求行、请求头、请求参数 <1>获取请求行消息的相关方法: 常用的请求行方法: [1]获取请求提交的方式:getMethod(); [2]获取请求的协议:getProtocol(); [3]获取项目名称:getContentPath(); [4]获取servlet路径:getServletPath(); [5]获取请求路径:getRequestURI(),getRequestURL(); 例如:
别团等shy哥发育
2023/02/27
5610
Servlet学习笔记6(request请求对象、response响应对象2)
重定向和转发区别[通俗易懂]
浏览器的请求发送给组件1, 组件1经过一些处理之后, 将request和response对象“传递”给组件2,由组件2继续处理, 然后输出响应(当然,也可以继续向其他组件“传递”), 这个传递的过程称之为“转发”。整个过程只涉及一次浏览器和服务器之间的“请求-响应”,转发过程中的组件共享同一个请求(request)和响应(response)对象。 转发的意义在于可以实现组件的**“分工”。**在基于MVC,多层结构的Web应用中,经常需要多个组件协同完成一次“请求-响应”工作,
全栈程序员站长
2022/10/04
1K0
重定向和转发区别[通俗易懂]
JavaWeb——HTTP响应协议及Response对象使用方法一点通及案例实战(重定向、输出字符/字节数据到浏览器、验证码实现)
HTTP协议,请求消息是客户端发送给服务器的数据,响应消息是服务器端发送给客户端的数据,其数据格式为:
Winter_world
2020/09/25
1.2K0
JavaWeb——HTTP响应协议及Response对象使用方法一点通及案例实战(重定向、输出字符/字节数据到浏览器、验证码实现)
HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象、代表响应的一个 HttpServletResponse对象;
Albert_xiong
2021/06/21
5840
HttpServletResponse
Java Web学习总结(八)——HttpServletResponse对象(二)
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
Java团长
2018/08/03
8270
JavaWeb核心篇(2)——Request和Response
上篇文章中提及到了Servlet,在Servlet中我们主要继承了HTTPServlet类,在HTTPServlet类中我们会接触到两个对象
秋落雨微凉
2022/10/25
6310
JavaWeb核心篇(2)——Request和Response
HttpServletResponse对象
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象和代表响应的 response 对象。
用户9615083
2022/12/25
8090
HttpServletResponse对象
[Java拾遗四]JavaWeb基础之Servlet_Request&&Response
今天来回顾下之前学过Servle的Resquest以及Response的知识. 1,Request和Response技术: rr的作用:         request是请求,封装用户的请求信息.若想获取请求信息,找request就行了         response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了 rr的体系结构:         request         在servlet中有一个service(ServletRequest,ServletRespon
一枝花算不算浪漫
2018/05/18
7280
`request.getScheme()` 使用方法详解
在 Java 的 Web 开发中,我们常常需要处理用户的请求,并获取请求的相关信息。request.getScheme() 是 Java Servlet 中用于获取请求协议的方法,它能够帮助我们判断请求是通过 HTTP 还是 HTTPS 传输的。在构建安全性检查或动态配置时,这一方法显得尤为重要。
默 语
2024/11/26
4150
JavaWeb day8 Request和Response快速入门(下)Response
介绍完Response的相关体系结构后,接下来对于Response我们需要学习如下内容:
小小程序员
2023/02/22
7841
JavaWeb day8 Request和Response快速入门(下)Response
SpringBoot实现同域SSO
个人理解:当用户登录访问demo1.lzmvlog.top时,同时具有访问demo2.lzmvlog.top的能力,即认证完成一次,可以访问所有系统。
是小张啊喂
2021/03/25
4700
servlet--response、request
/* String s = "Hello outputStream"; byte[] bytes = s.getBytes(); response.getOutputStream().write(bytes); */ /** * 演示响应字节数据 */ // 把一张图片读取到字节数组中 String path = "F:/F/白冰.jpg"; FileInputStream in = new FileInputStream(path); // byte[] bytes = IOUtils.toByteArray(in);//读取输入流内容的字节到字节数组中。 // response.getOutputStream().write(bytes); IOUtils.copy(in, response.getOutputStream()); 3 设置响应头信息   可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器! l response.setHeader(“content-type”, “text/html;charset=utf-8”):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”); l response.setHeader("Refresh","5; URL=http://www.itcast.cn"):5秒后自动跳转到传智主页。 /* * 下面是用来发送响应体! */ PrintWriter writer = response.getWriter(); writer.print("欢迎XXX登录!5秒钟后会自动跳转到主页!您看到的一定是乱码!"); /* * 设置名为Refresh的响应头 */ response.setHeader("Refresh", "5;URL=/day10_1/EServlet"); 4 设置状态码及其他方法 l response.setContentType("text/html;charset=utf-8"):等同与调用response.setHeader(“content-type”, “text/html;charset=utf-8”); l response.setCharacterEncoding(“utf-8”):设置字符响应流的字符编码为utf-8; l response.setStatus(200):设置状态码; l response.sendError(404, “您要查找的资源不存在”):当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。 5 重定向 5.1 什么是重定向 当你访问http://www.sun.com时,你会发现浏览器地址栏中的URL会变成http://www.oracle.com/us/sun/index.htm,这就是重定向了。 重定向是服务器通知浏览器去访问另一个地址,即再发出另一个请求。
eadela
2019/09/29
8390
servlet--response、request
讲讲session是怎么工作的,session的用法?
马克-to-win:到现在为止,我们学会了一次单独的请求和响应之间传递参数。但是如何跨越几次请求响应之间传递参数呢?比如我以马克的身份登录,这是 一次请求响应。之后买书又是一次请求响应。如何买书的时候还记得买书的人是马克,而不是张三呢?马克这个参数存在哪呢?这是跨越两次访问。Sun公司为我 们提供了HttpSession这个接口。HttpSession session = request.getSession();通过这句话,你可以得到一个与你的浏览器绑定的session对象,存在Tomcat里。这 个session对象只认你这个浏览器,之后只要是你这个浏览器发出的请求,无论跨越多少次请求响应,这个session对象就对它开放,其它浏览器不能 访问。通过session.setAttribute()可以往session里面存值,session.getAttribute可以取值。问题是 session是如何识别你的浏览器呢?初学者可忽略:靠Cookie或者URL改写:如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持Cookie或者Cookie功能被关闭,则自动使用URL改写方法。拿cookie来说(通常客户很少见关闭cookie,即使你关了,我也可以发现,之后提醒你打开或编程序重写URL),服务器往客户端写东西时,cookie会带上sessionid。当客户端再次访问服务器时,同一path下,会自动在html请求头中带上cookie信息,服务器可以在_COOKIE域中得取到想要的sessionid。
马克java社区
2021/07/07
7320
ServletRequest&ServletResponse
服务器将服务封装成一个servlet服务对象,那么客户的请求携带的数据也可以封装成一个ServletRequest服务请求对象,本质是一个接口,由不同的客户端发送进行实现,并将发送的数据封装至对应对象发送给服务器端
张哥编程
2024/12/13
1850
JavaWeb——HTTP请求协议及request对象使用方法一点通与request登录实战案例(含BeanUtils类的使用)
HTTP,Hyper Text Transfer Protocol,超文本传输协议,定义了客户端和服务器通信时,发送数据的格式。其特点是:
Winter_world
2020/09/25
1.3K0
JavaWeb——HTTP请求协议及request对象使用方法一点通与request登录实战案例(含BeanUtils类的使用)
推荐阅读
相关推荐
JavaWeb(七)之详解JavaWeb路径
更多 >
交个朋友
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入前端趋势交流群
追踪前端新趋势 交流学习心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验