spring mvc 基于表单的认证过程及cookie应用和session管理

来源:互联网 发布:篱笆是什么意思网络语 编辑:程序博客网 时间:2024/06/14 10:15

我们日常生活中都会接触到各种登录过程,基于表单的认证一般是将客户端发送过来的用户ID和密码与之前登录过的信息做匹配来进行认证的。这个过程我们都很清楚,不过HTTP协议是无状态协议,不能保存用户登陆的状态。要清楚是哪个用户的在访问服务器的话,就会用到浏览器cookie和保存在服务器端的session。


简单可以分为下面的步骤:
  • 客户端-》服务器 发送登录信息
  • 服务器-》客户端 Set-Cookie,包含session ID的cookie保存在浏览器。
  • 客户端-》服务器 发送包含session ID的cookie,服务器可以根据session ID知道是哪个用户。

在使用 spring mvc框架时,看看具体登录过程和协议头。


1:登录过程

客户端把用户ID和密码等登录信息放入报文的实体部分,通常是以POST方法把请求发送给服务器。服务器接收到这些信息后,后台可能会以这种方式把信息保存到session。
request负责获取客户端提交过来的数据。response负责向客户端输出数据。
String userName = request.getParameter("username");String passWord = request.getParameter("password");request.getSession().setAttribute("userName", userName);request.getSession().setAttribute("passWord", passWord);

2:Set-Cookie过程

Response HeadersContent-Length:0Date:Thu, 16 Nov 2017 06:32:29 GMTLocation:/test/Login/indexServer:Apache-Coyote/1.1Set-Cookie:JSESSIONID=A6C8AD43CB49F0F7CB5F762D45B7DDFC; Path=/test; HttpOnly

看上面这个Response Headers,HTTP响应首部字段中Set-Cookie,可以注意到里面有个JSESSIONID的字段,这个就是session ID,你可以把session ID想象成一种用以区分不同用户的等位号。所用的框架不同字段也有一些差别,有的也叫PSESSIONID。浏览器收到这个响应后会将其作为cookie保存到本地。这个session ID是由服务器生成,由一个生成的规则生成,每次生成的session ID也是不一致的。

注意Set-Cookie字段中最后的HttpOnly,cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。我们在JavaScript中用document.cookie 是不能获取到这些cookie信息的。

可以用Chrome浏览器中看一下现在的cookie






3:客户端发送包含session ID的cookie过程

Request Headersview sourceAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding:gzip, deflate, brAccept-Language:zh-CN,zh;q=0.9Connection:keep-aliveCookie:JSESSIONID=A6C8AD43CB49F0F7CB5F762D45B7DDFC; Webstorm-ca6f32d6=f058426d-4048-4002-80eb-843c24c16feeHost:localhost:8080Upgrade-Insecure-Requests:1User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36

看上面这个Request Headers,HTTP请求首部字段中的Cookie包含了JSESSIONID这个信息,服务器收到之后可以通过这个信息知道你是张三还是李四了。服务器端的session,有一个session ID和它对应,一个session对应着一个会话用户的信息。当登录成功之后每次访问服务器,HTTP的请求头部中都会包含这个cookie字段。

在清除浏览器的缓存时,如果清除掉了cookie信息,在访问页面的时候又会重定向到登录页面。




下面看一下spring mvc的具体配置和过程

在web.xml中可以配置session的过期时间,单位为分钟,这里配置的过期时间是一个小时。
<session-config><session-timeout>60</session-timeout></session-config>

在dispacher-servlet.xml中配置URL拦截器
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**" /><!-- 需排除拦截的地址 --><mvc:exclude-mapping path="/resources/**" /><mvc:exclude-mapping path="/Login/**" /><bean id="commonInterceptor" class="ciss.web.interceptor.LoginInterceptor"></bean> <!--这个类就是我们自定义的Interceptor --></mvc:interceptor></mvc:interceptors>

LoginInterceptor类
preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法
package ciss.web.interceptor;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// TODO Auto-generated method stubif (request.getSession().getAttribute("userName") != null&& request.getSession().getAttribute("passWord") != null) {return true;} else {response.sendRedirect(request.getContextPath() + "/Login/index");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

如果判断没有这个这个用户的session信息,就重定向到登录页。



阅读全文
0 0
原创粉丝点击