spring mvc 基于表单的认证过程及cookie应用和session管理
2017-11-16 16:13
447 查看
我们日常生活中都会接触到各种登录过程,基于表单的认证一般是将客户端发送过来的用户ID和密码与之前登录过的信息做匹配来进行认证的。这个过程我们都很清楚,不过HTTP协议是无状态协议,不能保存用户登陆的状态。要清楚是哪个用户的在访问服务器的话,就会用到浏览器cookie和保存在服务器端的session。
[b]简单可以分为下面的步骤:[/b]
客户端-》服务器 发送登录信息
服务器-》客户端 Set-Cookie,包含session ID的cookie保存在浏览器。
客户端-》服务器 发送包含session ID的cookie,服务器可以根据session ID知道是哪个用户。
在使用 spring mvc框架时,看看具体登录过程和协议头。
request负责获取客户端提交过来的数据。response负责向客户端输出数据。
看上面这个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
看上面这个Request Headers,HTTP请求首部字段中的Cookie包含了JSESSIONID这个信息,服务器收到之后可以通过这个信息知道你是张三还是李四了。服务器端的session,有一个session ID和它对应,一个session对应着一个会话用户的信息。当登录成功之后每次访问服务器,HTTP的请求头部中都会包含这个cookie字段。
在清除浏览器的缓存时,如果清除掉了cookie信息,在访问页面的时候又会重定向到登录页面。
在web.xml中可以配置session的过期时间,单位为分钟,这里配置的过期时间是一个小时。
在dispacher-servlet.xml中配置URL拦截器
LoginInterceptor类
preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false
时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
如果判断没有这个这个用户的session信息,就重定向到登录页。
[b]简单可以分为下面的步骤:[/b]
客户端-》服务器 发送登录信息
服务器-》客户端 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 Headers Content-Length:0 Date:Thu, 16 Nov 2017 06:32:29 GMT Location:/test/Login/index Server:Apache-Coyote/1.1 Set-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 Headers view source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding:gzip, deflate, br Accept-Language:zh-CN,zh;q=0.9 Connection:keep-alive Cookie:JSESSIONID=A6C8AD43CB49F0F7CB5F762D45B7DDFC; Webstorm-ca6f32d6=f058426d-4048-4002-80eb-843c24c16fee Host:localhost:8080 Upgrade-Insecure-Requests:1 User-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 { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub if (request.getSession().getAttribute("userName") != null && request.getSession().getAttribute("passWord") != null) { return true; } else { response.sendRedirect(request.getContextPath() + "/Login/index"); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
如果判断没有这个这个用户的session信息,就重定向到登录页。
相关文章推荐
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- 将 Shiro 作为应用的权限基础 二:基于SpringMVC实现的认证过程
- ASP.NET应用中用C#实现基于表单的认证
- JavaWeb应用中的身份验证(声明式)——基于表单的身份认证
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- 基于802.1x认证技术的应用分析
- 【WebMisCentral WMC】基于Extjs 4.2x的企业级用户授权认证中心系统(SSO+AM+SM),多租户SAAS应用
- 解析cookie欺骗实现过程及具体应用
- 基于802.1x认证技术的应用分析(转)
- 基于cookie验证的php应用的一种SSO解决方案
- SharePoint 2013 配置基于表单的身份认证
- Spring MVC中基于自定义Editor的表单数据处理技巧
- 基于802.1x认证技术的应用分析
- 使用 AngularJS & NodeJS 实现基于 token 的认证应用
- 基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)
- 为SharePoint 2010配置基于表单的身份认证
- spring MVC中基于hibernate validator的form表单验证
- spring MVC中基于hibernate validator的form表单验证
- 基于XML配置的Spring MVC 简单的HelloWorld实例应用
- ELKstack-基于java工程tomcat应用日志处理过程-02