使用(Filter)过虑器实现对Session是否过时的判断

通过配置SessionFilterImpl过滤器实现对Session是否过时的全局检查。该过滤器在web.xml中定义,并应用于所有请求路径,自动重定向未登录用户至登录页面。

使用(Filter)过虑器实现对Session是否过时的判断
 
 
在开发时,在第个页面,或者BaseAction对Session是否超时正行判断,但随着项目越来越来.页面很的时候写起来会觉得烦,由于项目需要最近做了一个这样的例子。

    web.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  
<filter>
     
<filter-name>sf</filter-name>
     
<filter-class>com.pdw.websystem.SessionFilterImpl</filter-class>
  
</filter>
  
<filter-mapping>
    
<filter-name>sf</filter-name>
    
<url-pattern>/*</url-pattern>
  
</filter-mapping>
  
<servlet>
    
<servlet-name>action</servlet-name>
    
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    
<init-param>
      
<param-name>config</param-name>
      
<param-value>/WEB-INF/struts-config.xml</param-value>
    
</init-param>
    
<init-param>
      
<param-name>debug</param-name>
      
<param-value>3</param-value>
    
</init-param>
    
<init-param>
      
<param-name>detail</param-name>
      
<param-value>3</param-value>
    
</init-param>
    
<load-on-startup>0</load-on-startup>
  
</servlet>

  
<servlet-mapping>
    
<servlet-name>action</servlet-name>
    
<url-pattern>*.do</url-pattern>
  
</servlet-mapping>
  
<session-config>
   
<session-timeout>2</session-timeout>
  
</session-config>
  
<listener>
   
<listener-class>com.pdw.websystem.SessionListenerImpl</listener-class>
  
</listener>
</web-app>


SessionFilterImpl.java文件如下:

package com.pdw.websystem;


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class SessionFilterImpl implements Filter {


    
protected String encoding = null;


    
protected FilterConfig filterConfig = null;


    
protected boolean ignore = true;

    
public void destroy() {

        
this.encoding = null;
        
this.filterConfig = null;

    }



    
/**
     * Select and set (if specified) the character encoding to be used to
     * interpret request parameters for this request.
     *
     * 
@param request The servlet request we are processing
     * 
@param result The servlet response we are creating
     * 
@param chain The filter chain we are processing
     *
     * 
@exception IOException if an input/output error occurs
     * 
@exception ServletException if a servlet error occurs
     
*/

    
public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
 
throws IOException, ServletException {
    
     HttpServletRequest hrequest
=(HttpServletRequest)request;
     HttpServletResponse hresponse
=(HttpServletResponse)response;
     HttpSession session
=hrequest.getSession();
     
if(session.getAttribute("name")==null){
      hresponse.sendRedirect(
"logon.jsp");
     }

        chain.doFilter(request, response);

    }



    
/**
     * Place this filter into service.
     *
     * 
@param filterConfig The filter configuration object
     
*/

    
public void init(FilterConfig filterConfig) throws ServletException {

    }

}



 

使可轻松实现对Session是否超时的判断
 
<think>好的,我现在需要详细介绍Spring MVC拦截及其使用。首先,我得回忆一下自己对Spring MVC拦截的理解,确保没有遗漏关键点。 拦截,Interceptor,是Spring MVC中用于在请求处理的不同阶段执行操作的组件。类似过滤,但更细粒度,针对Controller的请求。记得它有三个主要方法:preHandle、postHandle、afterCompletion。这三个方法分别在处理前、处理后和完成后执行。需要详细说明每个方法的作用和时机。 接下来,要说明如何创建拦截。用户需要实现HandlerInterceptor接口,或者继承HandlerInterceptorAdapter(虽然可能过时了,现在Spring 5可能推荐直接实现接口)。要给出一个简单的例子,比如日志拦截,记录请求开始和结束时间,或者权限检查的例子。 然后,配置拦截的方式。在Spring MVC的配置类中,通过实现WebMvcConfigurer接口,重写addInterceptors方法,添加自定义的拦截,并指定拦截的路径和排除的路径。例如,使用registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");这样的代码。 还需要注意拦截的执行顺序,如果有多个拦截,它们的preHandle按配置顺序执行,postHandle和afterCompletion则相反。这点很重要,用户可能会遇到执行顺序问题,需要解释清楚。 另外,要提到拦截的应用场景,比如日志记录、权限验证、性能监控、事务管理、国际化处理等。每个场景可以举个小例子,说明如何使用对应的拦截方法。 可能需要注意的常见问题,例如拦截与过滤的区别,拦截是否能修改请求参数,或者如何处理响应数据。还有,在preHandle返回false时,后续处理会被中断,需要说明这种情况的应用,比如权限验证失败时跳转到登录页。 还要确保代码示例正确,符合当前Spring的版本。比如,现在可能更推荐使用实现WebMvcConfigurer的Java配置方式,而不是XML配置。但用户可能两种都需要,不过现在主流是Java配置,所以重点放在上面。 检查是否有遗漏的部分,比如拦截的注册方式、路径匹配模式、排除特定路径、多个拦截的顺序控制。同时,确保提到拦截可以访问处理方法的上下文,比如ModelAndView对象,但afterCompletion在渲染视图之后执行,适合资源清理操作。 最后,总结一下使用步骤:创建拦截类,实现接口并重写方法;配置拦截,注册并设置拦截路径;测试验证拦截的效果。可能还需要提醒用户注意拦截的执行流程,避免在拦截中做耗时操作影响性能,或者循环拦截的问题。 现在把这些内容组织成结构清晰的回答,分步骤说明,并给出代码示例。确保术语正确,比如HandlerInterceptor接口的正确拼写,方法名的正确性。可能还需要指出在Spring Boot中的配置方式是否有所不同,但一般来说,配置类的方式是通用的。 确认没有违反系统级指令,比如数学公式的使用,但这个问题不涉及数学内容,所以可能不需要。但其他如中文回答、结构清晰等必须遵守。检查是否有错别字,逻辑是否通顺,用户是否能按照步骤实现拦截。</think>### Spring MVC拦截详解及使用步骤 --- #### 一、拦截核心概念 **拦截(Interceptor)** 是Spring MVC框架中用于在请求处理的不同阶段插入自定义逻辑的组件。它作用于Controller层,可拦截HTTP请求并在以下三个关键节点执行操作: | 方法名 | 执行时机 | 返回值作用 | |-----------------|---------------------------------|----------------------------| | `preHandle` | Controller方法执行前 | `true`放行,`false`终止流程 | | `postHandle` | Controller方法执行后,视图渲染前 | 修改ModelAndView对象 | | `afterCompletion` | 视图渲染完成后 | 资源清理(如关闭流) | --- #### 二、拦截与过滤的区别 | 特性 | 拦截(Interceptor) | 过滤Filter) | |--------------|-----------------------------------|-------------------------------| | 作用范围 | Spring MVC框架内 | Servlet规范,所有Web请求 | | 依赖关系 | 依赖Spring容 | 不依赖Spring | | 控制粒度 | 针对Controller请求 | 所有HTTP请求 | | 获取上下文 | 可通过`HandlerMethod`获取方法信息 | 仅能获取Servlet API对象 | --- #### 三、实现自定义拦截 **步骤1:创建拦截类** ```java public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 示例:检查用户登录状态 HttpSession session = request.getSession(); if (session.getAttribute("user") == null) { response.sendRedirect("/login"); return false; // 拦截请求 } return true; // 放行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 可添加全局模型数据 modelAndView.addObject("version", "1.0.0"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 记录请求完成时间 long startTime = (Long) request.getAttribute("startTime"); System.out.println("请求耗时:" + (System.currentTimeMillis() - startTime) + "ms"); } } ``` **步骤2:配置拦截(Java Config方式)** ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**") // 拦截所有路径 .excludePathPatterns("/login", "/static/**"); // 排除登录页和静态资源 registry.addInterceptor(new LogInterceptor()).order(1); // 设置多个拦截顺序 } } ``` --- #### 四、拦截执行流程 假设配置了两个拦截 **Interceptor1** 和 **Interceptor2**: 1. **preHandle** 执行顺序:Interceptor1 → Interceptor2 2. **postHandle** 执行顺序:Interceptor2 → Interceptor1 3. **afterCompletion** 执行顺序:Interceptor2 → Interceptor1 --- #### 五、典型应用场景 1. **身份验证** ```java public boolean preHandle(...) { if (!isAuthenticated(request)) { response.sendError(401, "Unauthorized"); return false; } return true; } ``` 2. **日志记录** ```java public void afterCompletion(...) { log.info("[{}] {} - {}ms", request.getMethod(), request.getRequestURI(), System.currentTimeMillis() - startTime); } ``` 3. **性能监控** ```java public boolean preHandle(...) { request.setAttribute("startTime", System.currentTimeMillis()); return true; } ``` 4. **全局数据注入** ```java public void postHandle(...) { modelAndView.addObject("currentUser", getCurrentUser()); } ``` --- #### 六、注意事项 1. **路径匹配规则** - `/**` 匹配所有路径(含子路径) - `/api/*` 仅匹配单层路径 - `/admin/**` 匹配/admin下的所有层级 2. **避免循环拦截** 不要配置拦截拦截自身的错误页面(如`/error`) 3. **性能优化** 在`preHandle`中优先进行轻量级检查,耗时操作建议异步处理 --- 通过合理使用拦截,可以实现横切关注点(Cross-Cutting Concerns)的统一处理,提升代码的可维护性。实际开发中建议结合具体业务需求设计拦截逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值