当前位置:首页 > Java面试题集116-135
这两种方式很难处理跨越多个页面的信息传递,因为如果每次都要修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得非常麻烦。
③cookie:cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。会话中可以为用户保存信息。会话对象是在服务器内存中的,而基于窗口的cookie是在客户端内存中的。如果浏览器禁用了cookie,那么就需要通过下面两种方式进行会话跟踪。当然,在使用cookie时要注意几点:首先不要在cookie中存放敏感信息;其次cookie存储的数据量有限(4k),不能将过多的内容存储cookie中;再者浏览器通常只允许一个站点最多存放20个cookie。当然,和用户会话相关的其他信息(除了会话ID)也可以存在cookie方便进行会话跟踪。
④HttpSession:在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
126、过滤器有哪些作用和用法?
答: Java Web开发中的过滤器(filter)是从Servlet 2.3规范开始增加的功能,并在Servlet 2.4规范中得到增强。对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。 和过滤器相关的接口主要有:Filter、FilterConfig、FilterChain 编码过滤器的例子:
[java] view plain copy
1. package com.lovo.filter; 2.
3. import java.io.IOException; 4.
5. import javax.servlet.Filter; 6. import javax.servlet.FilterChain; 7. import javax.servlet.FilterConfig; 8. import javax.servlet.ServletException; 9. import javax.servlet.ServletRequest; 10. import javax.servlet.ServletResponse; 11. import javax.servlet.annotation.WebFilter; 12. import javax.servlet.annotation.WebInitParam; 13.
14. @WebFilter(urlPatterns = { \ },
15. initParams = {@WebInitParam(name=\, value=\)}) 16. public class CodingFilter implements Filter { 17. private String defaultEncoding = \; 18.
19. @Override
20. public void destroy() { 21. } 22.
23. @Override
24. public void doFilter(ServletRequest req, ServletResponse resp, 25. FilterChain chain) throws IOException, ServletException { 26. req.setCharacterEncoding(defaultEncoding); 27. resp.setCharacterEncoding(defaultEncoding); 28. chain.doFilter(req, resp); 29. } 30.
31. @Override
32. public void init(FilterConfig config) throws ServletException { 33. String encoding = config.getInitParameter(\); 34. if (encoding != null) {
35. defaultEncoding = encoding; 36. } 37. } 38. }
下载计数过滤器:
[java] view plain copy
1. package com.accp.filter; 2.
3. import java.io.File; 4. import java.io.FileReader; 5. import java.io.FileWriter; 6. import java.io.IOException; 7. import java.util.Properties;
8. import java.util.concurrent.ExecutorService; 9. import java.util.concurrent.Executors; 10.
11. import javax.servlet.Filter; 12. import javax.servlet.FilterChain; 13. import javax.servlet.FilterConfig; 14. import javax.servlet.ServletException; 15. import javax.servlet.ServletRequest; 16. import javax.servlet.ServletResponse; 17. import javax.servlet.annotation.WebFilter; 18. import javax.servlet.http.HttpServletRequest; 19.
20. @WebFilter(urlPatterns = {\})
21. public class DownloadCounterFilter implements Filter { 22.
23. private ExecutorService executorService = Executors.newSingleThreadExecutor(); 24. private Properties downloadLog; 25. private File logFile; 26.
27. @Override
28. public void destroy() {
29. executorService.shutdown(); 30. } 31.
32. @Override
33. public void doFilter(ServletRequest req, ServletResponse resp, 34. FilterChain chain) throws IOException, ServletException { 35. HttpServletRequest request = (HttpServletRequest) req; 36. final String uri = request.getRequestURI(); 37. executorService.execute(new Runnable() { 38.
39. @Override
40. public void run() {
41. String value = downloadLog.getProperty(uri);
42. if(value == null) {
43. downloadLog.setProperty(uri, \); 44. } 45. else {
46. int count = Integer.parseInt(value);
47. downloadLog.setProperty(uri, String.valueOf(++count)); 48. } 49. try {
50. downloadLog.store(new FileWriter(logFile), \); 51. }
52. catch (IOException e) { 53. e.printStackTrace(); 54. } 55. } 56. });
57. chain.doFilter(req, resp); 58. } 59.
60. @Override
61. public void init(FilterConfig config) throws ServletException { 62. String appPath = config.getServletContext().getRealPath(\); 63. logFile = new File(appPath, \); 64. if(!logFile.exists()) { 65. try {
66. logFile.createNewFile(); 67. }
68. catch(IOException e) { 69. e.printStackTrace(); 70. } 71. }
72. downloadLog = new Properties(); 73. try {
74. downloadLog.load(new FileReader(logFile)); 75. } catch (IOException e) { 76. e.printStackTrace(); 77. } 78. } 79. 80. }
共分享92篇相关文档