SpringMVC-简单的拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理

1.springmvc.xml配置

<!--拦截器  -->
	<mvc:interceptors>
	<!--多个拦截器是顺序执行的,谁在前面谁先拦截  -->
		<mvc:interceptor>
			<!-- 拦截请求的范围 -->
			<mvc:mapping path="/**"/>
			<!--该拦截对应的拦截器类  -->
			<bean class="com.dohit.interceptors.LoginIntercept"></bean>
		</mvc:interceptor>
		<!-- <mvc:interceptor>
		<mvc:mapping path="/**"/>
		<bean class="com.dohit.springmvc.filter.HandlerInterceptor2"></bean>
		</mvc:interceptor> -->
	</mvc:interceptors>

2.定义拦截器.实现HandlerInterceptor接口

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginIntercept implements HandlerInterceptor{
	/*
	   preHandle()
	 * controller执行前调用此方法
	 * 返回true表示继续执行,返回false中止执行
	 * 这里可以加入登录校验、权限拦截等
	 * 拦截器在拦截到请求时,对请求做的处理
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object obj) throws Exception {
		/*根据请求的url地址,判断这个请求是要访问那个handler
		 * 如果携带的请求不需要判定就直接放行,需要就进行判定
		 * */
		//1,得到url
		String path=request.getRequestURI();
		//2.判断url是否是toLogin.action或者是login.action
		if(path.contains("toLogin.action") || path.contains("login.action")){
			return true;
		}else{
			//其他请求都需要判断用户是否已登录
			//先判断当前工程下是否存在session,如果没有session直接拦截
			//request.getSession(false),是在获取session是如果有session就给我session
			//如果没有,不要创建,直接返回null
			HttpSession session =request.getSession(false);
			if(session!=null){
				//如果session不为空,需要判断session里是否有用户
				if(session.getAttribute("user")!=null){
					return true;
				}else{
					response.sendRedirect(request.getContextPath()+"/toLogin.action");
					return false;
				}
			}else{
				//如果session不存在,强制登录
				response.sendRedirect(request.getContextPath()+"/toLogin.action");
				return false;
			}
		}
		
		
	}
	
	/**
	 * controller执行后但未返回视图前调用此方法
	 * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
	 * 请求通过的检验,到达处理器,处理器处理完以后,返回的ModelAndView会让他携带
	 */
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("处理器业务走完了,MOdelAndView在我手里");
		
	}

	/**
	 * controller执行后且视图返回后调用此方法
	 * 这里可得到执行controller时的异常信息
	 * 这里可记录操作日志,资源清理等
	 * 所有流程走完,离开了拦截器,回到了dispathServlet
	 */
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("886");
		
	}

	

}

3.定义登陆类Controller

@Controller
public class LoginCon {
	UserService us = new UserServiceImpl();
	//跳转到登陆页面
	@RequestMapping("/toLogin.action")
	public String toLogin(){
		return "login";
	}
	//验证是否登陆成功
	@RequestMapping("/login.action")
	public String Login(Userinfo u,HttpSession session){
		System.out.println("到达处理器");
		Userinfo u1=us.getByNameAndPwd(u);
		if(u1!=null){
			//向session记录用户身份信息
			session.setAttribute("user", u1);
			return "../jsp/frame";
		}else{
			return "redirect:toLogin.action";
		}
		
	}
   //退出
	@RequestMapping("/logout")
	public String logout(HttpSession session)throws Exception{
		
		//session过期
		session.invalidate();
		return "redirect:toLogin.action";
	}

	

处理流程
1、有一个登录页面,需要写一个controller访问页面
2、登录页面有一提交表单的动作。需要在controller中处理。
a) 判断用户名密码是否正确
b) 如果正确,向session中写入用户信息
c) 返回登录成功,或者跳转到商品列表
3、拦截器。
a) 拦截用户请求,判断用户是否登录
b) 如果用户已经登录。放行
c) 如果用户未登录,跳转到登录页面。

发布了121 篇原创文章 · 获赞 2 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览