Servlet
Cookie
Cookie(曲奇),是一种在客户端存储数据的缓存技术,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。 原理是通过服务器将数据响应到客户端时,将数据存储到客户端的本地文件中。
Cookie的工作原理
- 首先浏览器向服务器发起请求;
- 服务器就会根据当前会话生成一个Cookie对象(默认保存会话ID),并且把数据保存在该对象内;
- 然后把该Cookie对象放在响应头,一并发送回客户端浏览器;
- 浏览器接收服务器响应后,将Cookie保存在浏览器端;
- 当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。
- 服务端从请求头中获取Cookie信息,并作出相应的处理
Cookie使用
创建并发送Cookie
//创建cookie
Cookie c = new Cookie("name","softeem");
//设置cookie的有效时间,单位是秒(默认的有效期跟session一致)
c.setMaxAge(60*60*24*7);//一周
// 设置cookie的作用域(域名:允许其他那些不同的项目访问当前cookie)
// c.setDomain("www.softeem.top");
c.setDomain("127.0.0.1");
//设置允许当前服务器下的那些路径允许访问当前cookie
c.setPath("*");
c.setPath("sss");
Cookie c2 = new Cookie("password","123456");
c2.setMaxAge(60*60*24);
//通过response对象将cookie信息发送到客户端
response.addCookie(c);
response.addCookie(c2);
response.sendRedirect("result.jsp");
读取Cookie
//从request对象中获取所有的cookie信息
Cookie[] cookies = request.getCookies();
for(Cookie c:cookies){
String name = c.getName();
String value = c.getValue();
out.println(name+"-->"+value+"<br>");
}
Cookie实例(记住账号)
创建并发送cookie
//将用户信息转码为json数据
String json = JSON.toJSONString(user);
//对数据进行http编码(Cookie中不允许存储中文)
json = URLEncoder.encode(json, "utf-8");
//记住密码
Cookie c = new Cookie("user", json);
//设置有效期
c.setMaxAge(60*60*24*365);
//将cookie信息加入到response对象中
response.addCookie(c);
读取并使用cookie
//获取所有cookie集合
Cookie[] cookies = request.getCookies();
String json = null;
if(cookies != null){
for(Cookie c:cookies){
//判断当前读取的cookie对象name是否为user
if(Objects.equals(c.getName(), "user")){
//获取value
json = c.getValue();
break;
}
}
}
//当获取的json数据不为null是,对数据解码并解析
if(Objects.nonNull(json)){
//将http编码之后的内容解码为正常的json字符串
json = URLDecoder.decode(json, "utf-8");
//通过json插件将json字符串解析为用户对象
User user = JSON.parseObject(json, User.class);
//将用户存储到pageContext
pageContext.setAttribute("user", user);
}
session和cookie的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- 从安全角度来看存储在服务端的数据相对存储在客户端的数据更安全,因此安全方面session会高于cookie。
- session会占用服务器内存空间,在大量客户端访问服务器时session数会随之增多,因此如果存储大量数据到session中将会直接影响服务器性能;而cookie存储在客户端,可以通过cookie分担session的压力。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放到session,其他信息如果需要保留(比如浏览记录信息,购物车等缓存数据),可以放在cookie中。
localStorage&sessionStorage(web前端:JS)
- setItem(key,value)
- getItem(key)
过滤器(Filter)
filter是servlet中一个重要的组件,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能 ;通过filter可以实现对请求响应编码的统一过滤,对非法访问的过滤,对于常见的XSS攻击过滤,以及敏感词过滤等。
Filter的创建与使用
Filter的创建过程跟Servlet类似:
- 创建普通java类实现Filter接口
- 实现接口中的未实现方法(init、doFilter、destroy)
- 配置Filter
示例代码如下:
/**
* 1. 实现Filter接口
* 2. 重写 init destroy doFilter方法
* 3. 配置过滤器(3.0以前需要在web.xml配置;3.0之后直接通过注解配置)
* @author mrchai
*/
@WebFilter("/*") //参数为设置过滤规则: /* 、*.do 、*.action 、 /static/*
public class MyFilter implements Filter{
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化。。。");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("进入过滤器");
//对请求放行
chain.doFilter(req, resp);
}
@Override
public void destroy() {
System.out.println("过滤器销毁。。。");
}
}
注意事项:
- 以上步骤中第三步为配置filter,在servlet3.0版本之前需要通过在web.xml中进行过滤器配置,具体配置方式如下:
<!-- 过滤器配置 --> <filter> <filter-name>MyFilter</filter-name> <filter-class>com.softeme.javaweb07.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
但是在servlet3.0之后,过滤器的配置可以通过一行注解(
@WebFilter
)实现
- 另外对于过滤器规则可以有如下的编写方式:
/*
过滤所有请求
*.jsp
过滤所有对于jsp为后缀的请求(其他后缀可以自定义,如:*.do
、*.action
、*.jspx
等)
/xxx/*
对指定目录下的资源过滤
/xxx/*.jsp
对指定目录下的jsp请求过滤
常见过滤器
编码过滤
过滤器(EncodingFilter)
public class EncodingFilter implements Filter{
private String encoding;
@Override
public void init(FilterConfig config) throws ServletException {
//从初始化参数中获取需要设置的字符集
encoding = config.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//设置请求响应的编码
req.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}
@Override
public void destroy() {
}
}
配置(web.xml)
<!-- 过滤器配置 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.softeme.javaweb07.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
考虑到编码的不确定性,这里使用配置文件进行配置,需要设置为哪种字符集时,只需要修改过滤器配置中的初始化参数值
<param-value>
即可.