SSM拦截器应用之登录权限认证

SSM拦截器应用之登录权限认证

拦截器:

拦截到某路径,进行操作。

1.DispatcherServlet:拦截到路径之后交给DispatcherServlet操作,用controller跳转。

SpringMVC具有统一的入口DispatcherServlet,DispatcherServlet是ssm框架前置控制器,所有的请求都通过DispatcherServlet。配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则可以自己定义,定义规则可以上网查,这里不一一叙述了,把拦截下来的请求,首先进入方法doDispatch(HttpServletRequest request, HttpServletResponse response)经过一系列步奏,找到你要请求的目标Controller,最后交给他处理(没有其他的拦截器)来处理。如果没有handle处理器就会返回去,不再执行后面,所以说能拦截jsp页面,JS等静态资源,但是不能处理。
在这里插入图片描述

2.自定义的拦截器:拦截到路径之后自己实现接口自己操作

那么自定义拦截器又是怎么实现的了,和前置拦截器有什么关系了?
首先请求通过统一入口进入DispatcherServlet,再DispatcherServlet里面有个方法寻找这个这个请求的处理器和Interceptor,这时候就会寻找到HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,就会找到你自定义的拦截器,继承HandlerInterceptor 有是三个方法,preHandle , postHandle 和 afterCompletion,preHandle 在业务处理器处理请求之前被调用,然后处理完请求就会调用postHandle,或者在视图渲染之前调用它,最后请求执行完,视图渲染完调用,DispatcherServlet完全处理完请求后被调用afterCompletion,可用于清理资源,如果定义多个拦截器,先定义的拦截器先执行preHandle,但是没有另外的两个方法,而是等待其他拦截器执行prehandle方法,知道最后一个拦截器执行完毕,也是从最后一个拦截器逆序执行这两个方法。
以登录权限认证为例:
在springmvc的配置文件中:

	 <!-- 配置登陆拦截器 -->
	 <mvc:interceptors>
	 	<mvc:interceptor>
	 		<mvc:mapping path="/**"/>
	 		<bean class="ssm.interceptor.LoginInterceptor" />
	 	</mvc:interceptor>
	 </mvc:interceptors>

拦截器:

package ssm.interceptor;

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;

import ssm.po.User;

/**
 * 登录权限认证--拦截器
 * @author Administrator
 *
 */
public class LoginInterceptor implements HandlerInterceptor{
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
		//获取请求的URL
		StringBuffer url = request.getRequestURL();
		//URL:除了login.jsp是可以公开访问的,其余的URL都要进行拦截控制
		if(url.indexOf("/first")>0||url.indexOf("/login/login")>0) {
			return true;
		}
		//获取session
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("USER");
		//判断session里是不是有登录信息
		if(user!=null) {
			return true;
		}
		request.setAttribute("msg", "你还没有登录,请先登录!");
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		return false;
	}
	
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {}
	
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {}
}

pojo类:不是一定要用来和数据库联系的

package ssm.po;

public class User {
	private String id;
	private String username;
	private String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

controller:

@Controller
@RequestMapping("/login")
public class login {
	//跳转到登录页面
	@RequestMapping("/first")
	public String reLogin() {
		return "login";
	}
	//登录页面的判断
	@RequestMapping("/login")
	public String login(HttpServletRequest request,Model model,HttpSession session) {
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		User user = new User();
		if(name.equals("ssm") && password.equals("123")) {
			user.setId(U.getUUID());
			user.setUsername(name);
			user.setPassword(password);
			session.setAttribute("USER", user);
			return "redirect:tofirst";
		}
		model.addAttribute("b", false);
		return "login";
	}
	//跳转到首页
	@RequestMapping("/tofirst")
	public String toFirst() {
		return "firstPage";
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43075298/article/details/85272961
今日推荐