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";
}
}