springMVC拦截器使用
spring拦截器
拦截器是我们在实际生产中需要用到的东西,让用户必须登录才能进入某些页面。在springMVC中只需配置这两步就可以使用拦截器了。
1.添加拦截器类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.jkxy.entity.User;
/**
* 拦截器必须实现HandlerInterceptor接口
*/
public class AuthorizationInterceptor implements HandlerInterceptor {
//设置不拦截的路径
//不拦截"/register"和"/index", "/login"请求
private static final String[] IGNORE_URI = { "/login","/index","/register"};
/**
* 该方法将在整个请求完成之后执行, 主要作用是用于清理资源的,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
System.out.println("AuthorizationInterceptor afterCompletion --> ");
}
/**
* 该方法将在Controller的方法调用之后执行, 方法中可以对ModelAndView进行操作 ,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
System.out.println("AuthorizationInterceptor postHandle --> ");
}
/**
* preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
* 该方法的返回值为true拦截器才会继续往下执行,该方法的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("AuthorizationInterceptor preHandle --> ");
//flag变量用于判断用户是否登录,默认为false
boolean flag = false;
//获取请求的路径进行判断
String servletPath = request.getServletPath();
System.out.println(servletPath);
//判断请求是否需要拦截
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
System.out.println("找到忽视路径");
flag = true;
break;
}
}
//拦截请求
if (!flag) {
//1.获取session中的用户
User user = (User) request.getSession().getAttribute("user");
//2.判断用户是否已经登录
if(user == null) {
//如果用户没有登录,则设置提示信息,跳转到登录页面
System.out.println("AuthorizationInterceptor拦截请求:");
request.setAttribute("message", "请先登录再访问网站");
//下面的路径是被拦截后返回的路径,一般是登录路径
//这边要修改返回路径到你的登录路径
request.getRequestDispatcher("index").forward(request, response);
} else {
//如果用户已经登录,则验证通过,放行
System.out.println("AuthorizationInterceptor放行请求:");
flag = true;
}
}
return flag;
}
}
2.在springmvc.xml中添加配置
<mvc:interceptors>
<mvc:interceptor>
<!-- 设置拦截路径,/**表示所有路径 ,/*表示只拦截一层如/login,/login/main这样就拦截不了 -->
<mvc:mapping path="/**"/>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="com.jkxy.util.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.配置xml中的拦截路径注意事项
我们都知道在SpringMVC拦截器中的/是配置全部路径.现在我有一个需求,想要拦截以/user/开头的请求.我的path写为/user/,这样就能拦截到所有的符号条件的请求.
然后我的项目需求增加了,我在项目中加入了多重权限控制并希望用拦截器去控制它.假设现在有个功能,只开放给管理员,所以我把它的访问路径设为/user/manager/xxxx/xxxx.所以我又加入了一个拦截器,希望拦截路径中存在/manager/的所有的请求.我把path写为/manager/’**,结果却不行.
user的拦截器正常,但是manager的拦截器却不工作,我一度以为是拦截器出现了错误.然后经过一下午检查,我发现我把路径改成/manager/user/xxxx/xxxx就变成了manager拦截器工作但user拦截器不工作.我就确定是path出了问题.在一次次修改尝试后,我明白了,原来/user/只适用于以/user/开头的请求,/user/的前面什么都不能有,由于我所有的请求都是/user/开头,所以user的拦截器一直都是可以正常运行的,但是manager拦截器就不同了,我的path写为/manager/,但是我所有带有/manager/的请求都是前面有/user/的,所以这不满足path路径中的/manager/.当你要在这个名称的前面加其他的一个名称时,你需要/*/manager/,如果前面有多个名称,就是//manager/,当然了,由于/**是通配符,所以以manager开头的url也符合这个条件.
(转载)原文:https://blog.csdn.net/yan245294305/article/details/82775641