首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Servlet编程之核心篇(三)

八、访问路径问题

理论解决方案

绝对路径只有一种,就是完整的URL;

相对路径分为多种情况:

这些理论内容都在上面,可能有些看不太明白,但没关系。继续往下看具体的例子,之后在回过头来看这些理论就会很透彻。

超链接前台路径举例分析

新建一个项目21-relativePath,在WebContent下创建一个文件夹images,然后复制一张图片到这里,更名为goal.jpg,新建一个index.html

注意:WebContent目录其实就是Web应用的根,它对应的其实就是I:\java.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\21-relativePath

表单前台路径举例分析

创建一个项目22-relativePath-2,index.html和LoginServlet.java

配置文件后台路径举例分析

我们直接以上一个项目的web.xml举例

Java文件后台路径举例分析

新建一个项目23-relativePath-3,创建两个Servlet

在地址栏中输入localhost:8080/23-relativePath-3/someServlet可以成功跳转

后台路径特例举例分析

将上一个例子中的请求转发改成重定向

前台页面中以路径开头的相对路径举例分析

将之前举的两个例子进行扩充,两个前台路径都去掉,

Java代码中以路径开头的相对路径举例分析

对于web.xml这样的配置文件来说,必须有,因为它是一个标识路径,而不是访问路径,若去掉则无意义了。

而对于Java文件后代路径来说,就是当前地址栏跳转时的资源路径,而且重定向无特例。

总结

绝对路径只有一种,就是完整的URL;

完整的URL路径 = 资源路径 + 资源名称

相对路径分为多种情况:

九、Servlet的线程安全问题线程安全问题的理论讲解

Servlet线程安全问题代码演示

新建一个项目,24-threadSecurity,创建一个index.html和一个LoginServlet.java

在输出username的值之前打上断点,然后开两个浏览器窗口,分别进行不同名称的用户登录,会发现前一个登录的用户名会被后一个用户名覆盖。

Servlet的线程安全问题的两种解决方案

方案一、将成员变量变成局部变量

方案二、synchronized

方案一是每个连接进来的都有一个单独的线程,不同线程之间没有影响;方案二则是以加锁的方式解决线程安全问题,缺点是使代码效率变低,每次只能有一个线程访问这段代码。

对线程安全问题的合理利用

我们在上一个项目中新建一个CountServlet.java进行计数使用,这样每访问一次页面就统计一下

十、CookieCookie简介

在浏览器中查看Cookie

不同的浏览器,其Cookie的保存位置及查看方式是不同的。删除了某一浏览器下的Cookie,不会影响到其他浏览器的Cookie。

在Chrome下查看Cookie的方式是:

设置高级隐私设置和安全性内容设置Cookie查看所有 Cookie 和网站数据

JavaEE中的Cookie

新建一个项目,25-cookie,web.xml和SomeServlet.java如下:

上面只是简单创建了两个Cookie,当浏览器访问http://localhost:8080/25-cookie/xxx/ooo/jjj/some时,会在响应中给出Cookie,这时的Cookie是临时的,当会话结束就会失效,也就是说浏览器关闭会失效;而当它还有效时,如果我们不设置Cookie的绑定路径而访问同一资源路径下的不同资源名称,虽然会报404错误,但是我们可以看到在它的请求中会带上之前获得的Cookie。

我们还可以手动设置Cookie绑定的路径,这样刚才的同一资源路径就不能提交Cookie请求了,而只有我们设置的路径才可以。注意:手动绑定的路径需要带上项目名。

我们还可以设置Cookie的有效期和存储位置

服务端获取并解析Cookie

在上一个项目中建立一个OtherServlet.java,配置路径为/xxx/ooo/jjj/other,将some的指定路径注释掉

Cookie的禁用

浏览器是可以禁用Cookie的。所谓禁用Cookie是指客户端浏览器不接收服务器发送来的Cookie。不过,现在很多网站若禁用了Cookie则无法正常访问。

Chrome禁用Cookie的方式

设置高级隐私设置和安全性内容设置Cookie允许网站保存和读取 Cookie 数据,将该选项关闭

十一、HttpSession

Session的基本用法

新建一个项目26-httpSession,新建SomeServlet.java、OtherServlet.java和index.html

我们先进入index.html,输入用户名跳转到some,然后在地址栏将some改为other、回车,进入other中。这种方式不是请求转发,因此request的域属性无效,相当于又一次请求了;但却处于同一个会话中,因此sessiob域属性是有效的。

Session的工作原理

Session的失效

Cookie禁用后的Session

一般来说:只要浏览器不关闭,就一直处于同一会话中,就算换了另一个标签页也是同一会话中;

但是只有在Session失效后才算是真正的完成一次会话,否则只关闭浏览器还是可以有办法恢复到Session未失效的状态;

方法的前提是要获得jsessionid,然后在地址栏输入已经失效的页面地址,然后在后面加上,就能访问了,即,这是手工重写的方式;因此我们退出网站的时候一定要用网站上提供的方式,而不要只关闭浏览器。

禁用Cookie后,服务器发过来的jsessionid就接收不到了,所以请求没法向服务器传送它,所以每次请求服务器都以为是一个新的Session,这样每次都会发一个随机串;但是可以在地址栏手动添加,这样就可以访问了。

Cookie禁用后重定向跳转时Session的跟踪

可以在服务器端通过代码解决Cookie禁用的Session问题,但这种方式其实就是上面说的那种将手工重写改为服务器重写,需要把jsessionid暴露在地址栏,事实上这样反而不安全了。

Cookie禁用后非重定向跳转时Session的跟踪

与上面相似,只不过调用的方法不同;事实上这几种方式根本和手工重写是一样的

域属性空间范围对比

一共有四大域属性空间,Servlet有三个,还有一个在jsp里,我们先比较一下这三个

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180214G0XZLD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券