Filter过滤器与Session会话跟踪技术
Filter过滤器
适用场景
1.为web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码)
2.用户授权Filter:负责检查用户请求,根据请求过滤用户非法请求
3.日志Filter:详细记录用户的特殊请求
4.负责解码Filter:包括对非标准解码的请求解码
5.XSLT Filter:能改变XML内容
用途
1.在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest,根据需要检查HttpServletRequest,可以修改HttpServletRequest头和数据
2.在HttpServletResponse到达客户端之前,拦截HttpServletResponse,根据需要检查HttpServletResponse,可以修改HttpServletResponse头和数据
Servlet Filter在controller之前检查并修改请求和响应的内容
一个Filter可负责拦截多个请求或者响应,一个请求或响应也可被多个请求拦截
Filter创建步骤
1.创建Filter类,实现javax.servlet.Filter接口的三个方法:
void init(FilterConfig config); // 用于完成Filter的初始化
void destroy(); //用于Filter销毁前,完成一些资源的回收
// 实现过滤功能,对每个请求以及响应增加的额外处理
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
2.在web.xml文件中配置Filter,或者直接使用注解
采用注解的程序例子:
1 /** 2 * Description: 设置request的编码集,并验证用户是否登录 3 */ 4 // 注解 5 @WebFilter(filterName = "loginFilter", 6 urlPatterns = {"/*"}, // 该Filter拦截该项目下的所有用户请求 7 initParams = { // 配置Filter初始化参数 8 @WebInitParam(name="encoding", value="utf8"), 9 @WebInitParam(name="loginPage", value="/login.jsp")}) 10 public class LoginFilter implements Filter { 11 12 // 用于访问Filter的配置信息 13 private FilterConfig config; 14 15 @Override 16 public void init(FilterConfig filterConfig) throws ServletException { 17 this.config = filterConfig; 18 } 19 20 @Override 21 public void destroy() { 22 this.config = null; 23 } 24 25 @Override 26 public void doFilter(ServletRequest servletRequest, 27 ServletResponse servletResponse, FilterChain chain) 28 throws IOException, ServletException { 29 // 获取Filter的配置参数 30 String encoding = config.getInitParameter("encoding"); 31 String loginPage = config.getInitParameter("loginPage"); 32 33 // 设置request编码用的字符集 34 servletRequest.setCharacterEncoding(encoding); 35 // 将ServletRequest请求转换成HttpServletRequest请求 36 HttpServletResquest request = (HttpServletRequest) servletRequest; 37 // 获取客户请求的页面 38 String requestPath = request.getServletPath(); 39 // 判断用户是否登录 40 HttpSession session = request.getSession(); 41 // 若没有,且访问页面不是登录页面 42 if (session.getAttribute("user") == null && !requestPath.endsWith(loginPage)){ 43 // 转发到登录页面 44 request.getRequestDispatcher("/jsp/login.jsp").forward(servletRequest, servletResponse); 45 } 46 else{ 47 // 放行 48 chain.doFilter(servletRequest, servletResponse); 49 } 50 } 51 52 }
如果不用注解的方式,需要在web.xml中配置自定义的拦截器:
1 <filter> 2 <filter-name>loginFilter</filter-name> 3 <filter-class>filter.LoginFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name><param-value>utf8</param-value> 6 <param-name>loginPage</param-name><param-value>/login.jsp</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>loginFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>
如果有多个拦截器,拦截会按照从上至下的顺序进行拦截,一般来说处理编码的拦截器配置在最上面。
有了上述步骤的操作,就可以通过URI进行访问。
此时如果能够取得Session中的logined值时,会直接进入下一步处理,否则直接进入登录页面。从而完成session的校验。
参考源:https://blog.csdn.net/wtopps/article/details/72870356
https://blog.csdn.net/qq_23835497/article/details/79626197
Session会话
定义
Session代表服务器与浏览器的一次会话过程,过程可以是连续的,也可以是时断时续的。
作用
Session是为了保持用户访问服务器的交互状态。
Session机制是一种服务器的机制。当程序需要为客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已经包含一个session id。
如果已经包含session id,说明以前已经为此客户创建过session,服务器就按照session id把session检索出来使用。如果客户请求里不含session id,则为此客户创建一个session,并且生成一个与此session相关联的session id,此session id将在本次响应中返回给客户端保存。
创建时机
session在有客户端访问时并没有被创建,直到server端程序(如Servlet)调用HttpServletRequest.getSession()/HttpServletRequest.getSession(true)此类语句时才会被创建。
删除时机
session在以下情况被删除:
1.程序调用HttpSession.invalidate()
2.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
3.服务器进程被停止
参考源:https://blog.csdn.net/canot/article/details/50667793
https://blog.csdn.net/pengpenglin/article/details/706095