SpringMVC拦截器监听session是否过期
什么是Session?
Session是Web应用程序的基本概念之一,Session对象代表一次会话过程,例如用户在浏览器访问Web应用程序时,服务器为其创建了一个Session对象,这个对象会在整个会话过程中进行传递,直到用户关闭浏览器或者主动退出。
什么是拦截器?
拦截器(Interceptor),又称拦截器链,是Web应用程序中常见的一种设计模式,它可以在请求到达控制器之前或者控制器返回结果之后进行自定义的操作,例如请求日志记录、权限验证、异常处理等等。SpringMVC框架中的拦截器是基于Java的AOP(面向切面编程)实现的,它可以有效地进行组合和重复利用。
拦截器实现监听Session
在Web应用程序中,使用Session对象进行状态管理是非常常见的,例如购物车、登录状态等等。但是,Session也很容易出现过期的问题,这时候如果用户还在进行请求,可能会导致错误的操作和不良的用户体验。因此,在Web应用程序中,需要对Session对象进行有效地管理和监听。
在SpringMVC框架中,可以通过拦截器来实现对Session的监听,具体步骤如下:
- 创建一个拦截器类,实现HandlerInterceptor接口。
public class SessionTimeoutInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 如果Session为null或者Session已过期,重定向到登录页面
if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
} else {
// 否则放行,继续执行后续的处理链
return true;
}
}
// 省略了postHandle和afterCompletion方法
}
- 在SpringMVC配置文件中,配置拦截器。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="sessionTimeoutInterceptor" class="com.example.interceptor.SessionTimeoutInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
这里使用了XML配置方式,通过
- 在Controller中,使用Session对象。
@Controller
public class UserController {
@RequestMapping("/user")
public String user(HttpSession session) {
User user = (User) session.getAttribute("user");
// ...
return "user";
}
}
这里使用了@Controller注解来定义Controller,通过@RequestMapping注解来映射URL路径。在方法中,可以使用HttpSession对象来获取Session属性,例如获取"user"属性。
- 示例
首先,创建一个基于SpringMVC框架的Web应用程序,然后编写相关的代码。
(1) 在web.xml文件中,配置DispatcherServlet和ContextLoaderListener。
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
(2) 在springmvc-servlet.xml配置文件中,配置组件扫描器、视图解析器和拦截器。
<!-- 配置组件扫描器 -->
<context:component-scan base-package="com.example"/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="sessionTimeoutInterceptor" class="com.example.interceptor.SessionTimeoutInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
(3) 创建一个拦截器类SessionTimeoutInterceptor。
public class SessionTimeoutInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
} else {
return true;
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
(4) 创建一个Controller类UserController。
@Controller
public class UserController {
@RequestMapping("/user")
public String user(HttpSession session) {
User user = (User) session.getAttribute("user");
if (user == null) {
return "redirect:/login";
} else {
return "user";
}
}
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/doLogin")
public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) {
if (username.equals("admin") && password.equals("123456")) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
session.setAttribute("user", user);
return "redirect:/user";
} else {
return "login";
}
}
}
(5) 创建一个JSP页面login.jsp。
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form action="doLogin" method="post">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
(6) 创建一个JSP页面user.jsp。
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
<title>User Page</title>
</head>
<body>
Welcome, ${user.username}!
</body>
</html>
运行Web应用程序,登录后打开浏览器console,可以看到因为Session过期而跳转到登录界面的核心日志。
[2022-01-01 10:00:00,000] [http-nio-8080-exec-1] DEBUG (org.springframework.web.servlet.DispatcherServlet) - GET "/springmvc/", parameters={}
[2022-01-01 10:00:00,001] [http-nio-8080-exec-1] DEBUG (org.springframework.web.servlet.handler.SimpleUrlHandlerMapping) - Mapped to com.example.UserController#user(HttpSession)
[2022-01-01 10:00:00,001] [http-nio-8080-exec-1] DEBUG (org.springframework.web.servlet.DispatcherServlet) - Completed 302 FOUND, headers={},也就是Session失效,用户被重定向到了登录页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC拦截器实现监听session是否过期详解 - Python技术站