1.session个cookie的区别?
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录
每个用户访问服务器都会建立一个session,那服务器是怎么标识用户的唯一身份呢?事实上,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。
2.forward和redirect的区别?
forward是转发的意思,redirect是重定向的意思。
1. 从地址栏显示来说:
1)forword是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。
2)redirect是服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的地址。
2。 从数据共享来说:
1)由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。即可以共享数据
2)redirect不能共享
- 从运用的地方来说
1)forword 一般用于用户登录的时候,根据角色转发到相应的模块
2) redirect一般用于用户注销登录时返回主页面或者跳转到其他网站
4.从效率来说:
1)forword效率高,而redirect效率低
- 从本质来说:
forword转发是服务器上的行为,而redirect重定向是客户端的行为
3.如何防止from表单提交
1 点击一次之后,按钮失效(不推荐,用户刷新页面仍能重复提交)
通过js代码,当用户点击提交按钮后,屏蔽提交按钮(使按钮无发点击提交或点击无效disabled),从而实现防止表单重复提交。
2 用redirect来解决重复提交问题
简而言之,表单提交后重定向到提交成功的一个页面。
3在数据库里添加约束
在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。简单粗暴的方法。
4 在session中存放一个特殊标志(推荐)。
类似于“令牌”机制。当表单页面第一次被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,若标志串相同则处理表单提交并立即从session中删除它。若不一致就是重复提交了则忽略这次提交。如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。
(解决struts2重复提交,可以结合s:token标签解决重复提交问题)
5 使用AOP自定义切入实现
4.简述web容器的listener和filter和servlet执行顺序和生命周期?
启动的顺序为listener->Filter->servlet.
简单记为:理(Listener)发(Filter)师(servlet).
Listener生命周期:一直从程序启动到程序停止运行。
Filter生命周期:程序启动调用Filter的init()方法(永远只调用一次,具体看启动日志),程序停止调用Filter的destroy()方法(永远只调用一次,具体看关闭日志),doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用,不管第几次,都在调用doGet(),doPost()方法之前)。
Filter生命周期:程序启动调用Filter的init()方法(永远只调用一次,具体看启动日志),程序停止调用Filter的destroy()方法(永远只调用一次,具体看关闭日志),doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用,不管第几次,都在调用doGet(),doPost()方法之前)。
5.JSP9大隐视对象中四个作用域的大小与作用范围
作用域大小:
四个作用域从大到小:appliaction>session>request>page
作用范围:
application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。
request:请求作用域,就是客户端的一次请求。
page:一个JSP页面。
以上作用范围使越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:
一个request可以包含多个page页(include,forward)。
6.过滤器(Filter)和拦截器(Interceptor)的区别
创建一个Filter只需两个步骤
创建Filter处理类
web.xml文件中配置Filter
void init(FilterConfig config):用于完成Filter的初始化。 void
destory():用于Filter销毁前,完成某些资源的回收。 void doFilter(ServletRequest
request,ServletResponse response,FilterChain
chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理。该方法可以实现对用户请求进行预处理(ServletRequest
request),也可实现对服务器响应进行后处理(ServletResponse
response)—它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
Filter和Interceptor的区别
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
7.web.xml的作用
一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但是web.xml并不是必须的,一个web工程可以没有web.xml文件。
web.xml工作过程
web.xml的执行流程
1 启动一个web项目时,容器(如tomcat)会去读web.xml,读取监听器和两个结点
2 然后容器创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文
3 容器将转换为键值对,并交给servletContext
4 容器创建中的类实例,创建监听器
5 在监听器中有contextInitialized(ServletContextEventargs)初始化方法,在这个方法中获得ServletContext=ServletContextEvent.getServletContext();context-param的值=ServletContext.getInitParameter(“context-param的键”)
6 得到这个context-param的值后,就可以做一些操作了,注意,这个时候web项目还没有完全启动成功,换句话说,这个时候对中的键值得操作,将在web项目完全启动以前被执行
举例:可以在项目启动之前就打开数据库,那么就可以在中设置数据库的连接方式,在监听类中初始化数据库的连接