八、访问路径问题
理论解决方案
绝对路径只有一种,就是完整的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里,我们先比较一下这三个
领取专属 10元无门槛券
私享最新 技术干货