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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值