下面是详细讲解“SSM项目使用拦截器实现登录验证功能”的完整攻略:
1.什么是拦截器
拦截器是Spring MVC框架提供的一种拦截器机制。其作用类似于Servlet中的过滤器,即对当前的请求对象和响应对象进行分析,隔离与处理请求及处理响应的过程。
2.实现拦截器的步骤
2.1 创建拦截器
首先,实现一个拦截器要实现HandlerInterceptor接口,并覆盖其三个方法:
- preHandle:在请求处理前进行调用,返回值为boolean类型,如果返回false,则请求终止,不会进入controller方法
- postHandle:在请求进行处理之后,在返回ModelAndView之前进行调用,可以对Controller处理后的ModelAndView进行操作
- afterCompletion:在整个请求处理之后进行调用,无论成功或失败都会执行,可以进行一些资源清除工作等
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2.2 配置拦截器
在SpringMVC中对拦截器进行配置需要在mvc-config.xml中加入以下配置,并指定拦截路径和不拦截路径
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
不拦截路径指的是哪些路径下的请求不需要经过拦截器进行过滤,比如静态资源文件、登录页面等。可在拦截器的preHandle()方法中进行判断并返回false。
示例1:不拦截登录页面
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/static/**"/>
<bean class="com.example.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
示例2:登录成功后重定向到原请求路径
在preHandle()方法中获取当前请求的URI参数,将其存储在session中,在登录成功后从session中取出并执行重定向操作。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
request.getSession().setAttribute("url", request.getRequestURI() + "?" + request.getQueryString());
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
return true;
}
3.注意事项
- 拦截器仅能拦截经过DispatcherServlet处理的请求,对于其他非DispatcherServlet处理的请求则无法拦截。如:静态文件(如:.jpg/.png/.css等),任何没有被DispatcherServlet处理的请求都会跳过拦截器。
- 拦截器可以使用@Autowired注解注入其他Bean,如果@Bean注解在拦截器上不会被执行。
- 如果拦截器中使用了response.sendRedirect()方法,则必须用return false来终止请求的处理,否则请求还是会继续进行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SSM项目使用拦截器实现登录验证功能 - Python技术站