若是一个用户想要修改本身的我的信息, 那么他必须是登陆状态下进行的java
本文章将会简单的配置一下拦截器的使用,以及一些简单介绍git
....github
SpringMVC提供了 Interceptor 拦截器几种机制:web
HandlerInterceptor
接口HandlerInterceptor
接口的类WebRequestInterceptor
接口WebRequestInterceptor
接口的类我会使用实现HandlerInterceptor
接口的机制, 其余的能够到网上查资料,用法是差很少的spring
查看 HandlerInterceptor
接口源码:session
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {
}
}
复制代码
三个方法的做用:mvc
preHandle: 执行 Handler 方法以前执行, 返回值是 Boolean 类型, 若是返回 false, 表示拦截请求,再也不向下执行, 若是返回 true , 表示放行, 程序继续向下进行(若是后面没有其余拦截器,就会直接执行 controller 方法)app
postHandle: 执行 Handler 以后, 返回 ModelAndView 以前执行dom
afterCompletion: 执行完 Handler 以后执行, 因为是在 controller 方法执行完毕后执行该方法, 因此该方法适合进行统一的异常或者日志处理操做jsp
package com.ujiuye.controller;
import com.ujiuye.domain.User;
import com.ujiuye.exception.UserException;
import com.ujiuye.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
private IUserService userService;
//登陆方法
@RequestMapping("login")
public String login(String username, String password, HttpSession session, Model model) throws UserException {
User user = userService.selectLogin(username, password);
if (user!=null){
//user对象放入session做用域
session.setAttribute("USER_IN_SESSION",user);
//跳转到用户列表页面
return "redirect:/user/query.do";
}else {
//跳转到登陆页面,提示用户名或密码错误
model.addAttribute("msg","用户名或者密码错误");
return "forward:/login.jsp";
}
}
}
复制代码
package com.ujiuye.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
//登陆检查,实现接口里的这个方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断session中是否有"USER_IN_SESSION"的key
HttpSession session = request.getSession();
Object user = session.getAttribute("USER_IN_SESSION");
if (user == null){
//跳转到登陆页面
response.sendRedirect("login.jsp");
return false;
}
return true;
}
}
复制代码
查看session是否有 USER_IN_SESSION 的key, 若是有就表明已经登录, 反之;
springMVC.xml 文件里
<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截的路径/*一级路径 /**全部路径-->
<mvc:mapping path="/**"/>
<!--排除登陆页面-->
<mvc:exclude-mapping path="/login.do"/>
<!-- 拦截器类-->
<bean class="com.ujiuye.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!--第二个拦截器-->
</mvc:interceptor>
<mvc:interceptor>
<!--第三个拦截器-->
</mvc:interceptor>
</mvc:interceptors>
复制代码
记得排除掉登陆页面;
</mvc:interceptors>
: 标签下能够建立多个拦截器, 从上往下执行
其实就是登陆成功后在session放入一个key, 而后拦截器实现 HandlerInterceptor
接口, 实现里面的方法, 判断session是否存在登陆的key, 有的话就是已登陆, 没有就再跳回登陆页面, 防止用户直接进入深一层的页面,
而后再springMVC.xml配置文件里配置一个全局拦截器,就ok了。
HandlerInterceptor
: 主要进行请求前, 和请求后的拦截而
WebRequestInterceptor
:针对请求的拦截器接口, 该接口中没有response
(响应),因此该接口只进行请求数据的准备和处理
查看 WebRequestInterceptor
接口源码:
public interface WebRequestInterceptor {
// 该方法返回值为 **void**,无返回值, 因为没有返回值, 因此使用该方法主要进行数据的前期准备,
void preHandle(WebRequest request) throws Exception;
void postHandle(WebRequest request, @Nullable ModelMap model) throws Exception;
void afterCompletion(WebRequest request, @Nullable Exception ex) throws Exception;
}
复制代码
我的博客: aaatao66.github.io/
此次的文章很短, 第二种接口的使用方法没有过多的描述, 若是想要知道能够到网上寻找相关资料