标签:post method val for 明细表 als blog equals 注册
对于cookie和session,作为程序员我们都听说过或者接触过,老生常谈了。不过不细谈还真不好把他们俩搞清楚。把cookie放在前面,是因为它出生的早,没有cookie,就没有session。但是有了session后,大家都不喜欢cookie了。为啥呢?接下聊。
首先,cookie和session都是客户端和服务端之间的沟通,而且都是服务端利用了客户端。当服务端需要区分不同的客户端时,在消息头里设置了cookie相关信息,主要是一个map来放cookie的名称和具体对象,客户端收到后就存放在本地。下一次客户端再次请求服务端时,把cookie信息带上消息头,服务端取到cookie就能识别客户端了,也能取到之前寄存在客户端的货物了。cookie就是一张通行证,不同的客户端有不同的通行证,通行证上有用户名和密码。服务端拿到通行证就能认出不同的客户端。比如我现在要做登陆,那么用户名和密码我都放在客户端寄存,通过cookie货物输送到了服务端,这时服务端得到了用户名和密码,再拿去跟原有的注册用户列表一比较,就知道给该用户能不能放行了。
session的原理跟cookie是一样的,也是寄存货物在客户端,不同的是寄存的是一个ID字符串而已,而真正的货物实际上还在服务端。还拿上面的登陆举例,这次我放在客户端的就是一串用户的身份证号码,通过session把这串身份证号码带到了服务端,然后服务端拿着这张身份证到自己的客户明细表里一查,找到了对应的客户信息,就能拿到用户名和密码了。
cookie的生命周期默认是随着客户端的打开而生、关闭而死的。cookie可以通过设置失效时间来延长寿命,这样就不用随着浏览器关闭而死亡了。既然session实际上也是个cookie,那么sessionID也是如此。但我们关心的不是身份证,而是session的值,这些货物存放的地方不是客户端,而是服务端,所以session的失效时间针对的是服务端。但是有一点比较坑,每次新打开浏览器都会实例化一个新session出来,就算你的服务端帮你存在原来的货物也没用,新的浏览器存放的是新的货物了。
回来开篇的问题,有了session,大家都不用cookie了,这是为啥?两个方面,一个是cookie在每次请求时都会传送,这会加大网络传输的压力;一个是cookie是放在消息头的,大小一般不能超过4KB,有了大小限制就不爽了。而这两个问题session都不存在,因为人家是存在服务端的,消息头只要一个字符串就够了。还有一个问题,cookie是可以禁用的,被禁了就玩完了?还有后门,URL重写,拼接到url后面作为参数传过去。这时session只要一个身份证号字符串,而cookie就麻烦了,拼对象吧。
说了半天,看个例子吧,还是拿登陆说事:
登陆的action:
/** * 执行登陆行为 * * @author wulinfeng * @param request * @param user * @return * @throws ServletException * @throws IOException */ @RequestMapping(value = "/loginAction.html", method = RequestMethod.POST) public @ResponseBody void loginAction(HttpServletRequest request, HttpServletResponse response, @RequestBody UserBean user) throws ServletException, IOException { response.setContentType("application/json;charset=UTF-8"); PrintWriter out = response.getWriter(); // 验证码校验 String validateCode = (String)request.getSession().getAttribute("randomString"); if (StringUtils.isEmpty(validateCode) || !validateCode.equals(user.getValidate().toUpperCase())) { out.print(PropertiesConfigUtil.getProperty("verify_code_error")); out.flush(); return; } // 用户名密码校验 String result = testPillingService.login(user.getUsername(), user.getPassword()); // 校验通过,创建token并放入session中;校验失败,返回错误描述 if ("success".equals(result)) { String tokenId = UUID.randomUUID().toString(); // 登陆成功后是使用cookie还是session来存放tokenId if (IS_COOKIE.equals("1")) { Cookie cookie = new Cookie("tokenId", tokenId); cookie.setMaxAge(3 * 24 * 60 * 60); // 3天过期 response.addCookie(cookie); } else { request.getSession(true).setAttribute("tokenId", tokenId); } if (user.getUsername().toUpperCase().equals("ADMIN")) { response.getWriter().print("register"); return; } } out.print(result); out.flush(); }
过滤器:
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 登陆拦截 * * @author wulinfeng * @version C10 2017年10月11日 * @since SDP V300R003C10 */ public class InterceptorUtil implements HandlerInterceptor { /** 日志对象 */ private static Logger logger = LogManager.getLogger(InterceptorUtil.class.getName()); /** 是否启用cookie */ private static final String IS_COOKIE = PropertiesConfigUtil.getProperty("iscookie"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("InterceptorUtil.doFilter requesturl: " + request.getRequestURL()); String tokenId = null; if (IS_COOKIE.equals("1")) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie == null) { continue; } if (cookie.getName().equals("tokenId")) { tokenId = cookie.getValue(); break; } } } } else { if (request.getSession() != null) { tokenId = (String)request.getSession().getAttribute("tokenId"); } } if (StringUtils.isEmpty(tokenId)) { response.sendRedirect("/login.html"); } return true; } @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 } }
标签:post method val for 明细表 als blog equals 注册
原文地址:http://www.cnblogs.com/wuxun1997/p/7725413.html