• 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

  • 相关阅读:
    hrbust 1788
    poj2299 ( bit )
    LA3027(并查集)
    hdu1166 (bit)
    hdu1598(并查集)
    cdoj1215 (并查集)
    hdu2643 ( 第二类斯特灵数 )
    hdu3625 ( 第一类斯特灵数 )
    Uva10066
    怎么处理sqlserver2017部署在winowsDocker上时区无法修改成功的方式,并且可以多创建新的容器调用简单的方式直接使用!
  • 原文地址:https://www.cnblogs.com/thevilewind/p/9128137.html
Copyright © 2020-2023  润新知