- 隐藏表单域
在表单中附加隐藏信息
====================================================================
Cookie(小饼干),是一种文本文件,保存在浏览器的某个目录中,保存用户信息。
可以保存浏览商品信息、账号、密码等。
特点:
-
通过请求头和响应头实现浏览器和服务器的传输
-
一般情况下Cookie文件不超过4k
-
网站最多有300个Cookie
-
服务器最多在客户端浏览器上保存20个Cookie
优缺点:
-
优点:文件小,使用方便
-
缺点:安全性差,长度有限,浏览器可以禁用
创建Cookie:
Cookie cookied = new Cookie(“名称”,“值”);
Cookie 常用方法:
-
String getName() 返回名称
-
String getValue() 返回值
-
setPath(“路径”) 设置保存路径
一般情况下setPath(“/”)保存到根路径
- setMaxAge(int) 设置保存时间(秒)
正数 文件保存秒数,负数 保存到内存,0 失效
添加Cookie
HttpServletResponse对象.addCookie(Cookie对象)
在响应头中会出现Set-Cookie: name=value
读取Cookie:
先遍历Cookie数组,找到getName和查找名称相同的Cookie:
Cookie[] HttpServletRequest对象.getCookies();
注意:Cookie中不能直接保存中文
解决方法:
保存时,使用URLEncoder.encode对Cookie的名称和值进行编码
读取时,使用URLDecoder.decode对Cookie的名称和值进行解码
案例:用Cookie保存用户名
/**
-
Cookie工具类
-
@author xray
*/
public class CookieUtils {
public static final int MAX_AGE = 24 * 60 * 60;
/**
-
保存Cookie
-
@param resp
-
@param name
-
@param value
*/
public static void save(HttpServletResponse resp,String name,String value){
//创建Cookie对象
try {
Cookie cookie = new Cookie(
URLEncoder.encode(name, “UTF-8”),
URLEncoder.encode(value, “UTF-8”));
//设置路径
cookie.setPath(“/”);
//设置保存时间
cookie.setMaxAge(MAX_AGE);
//添加Cookie
resp.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
-
读取Cookie
-
@param req
-
@param name
-
@return
*/
public static String read(HttpServletRequest req,String name){
//读取Cookie数组
Cookie[] cookies = req.getCookies();
//查找username的Cookie
try{
for(Cookie cookie : cookies){
if(name.equals(URLDecoder.decode(cookie.getName(), “UTF-8”))){
return URLDecoder.decode(cookie.getValue(), “UTF-8”);
}
}
}catch(Exception ex){
ex.printStackTrace();
throw new RuntimeException(ex);
}
return null;
}
}
通过过滤器读取Cookie
/**
-
在登陆页面前读取Cookie
-
@author xray
*/
public class ReadCookieFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//从Cookie读取账号,保存到request中
req.setAttribute(“username”,
CookieUtils.read((HttpServletRequest)req, “username”));
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
=====================================================================
Session就是服务器上的一块内存空间,每个用户访问网站时,都会开辟一块内存,用于保存该用户相关的数据。
Session的实现原理
问题:服务器如何知道Session是属于哪个用户的?
-
每个用户通过浏览器访问服务器时,服务器会创建一个Session保存用户的信息
-
创建Session同时会创建JSESSIONID字符串,用于唯一标识Session。
-
服务器响应浏览器时,将JSSESSIONID通过Cookie保存到用户的浏览器中
-
用户后面再访问服务器时,用户的请求会带上Cookie中的JSSESIONID
-
服务器通过JSESSIONID查找Session对象,读取用户信息。
获取HttpSession对象:
HttpSession session = request.getSession();
主要方法
-
Object getAttribute(String name) 获得数据
-
void setAttribute(String name, Object value) 保存数据
-
void removeAttribute(String name) 删除数据
-
invalidate() 销毁Session
Session的关闭