源码
创新互联是一家集网站建设,封丘企业网站建设,封丘品牌网站建设,网站定制,封丘网站建设报价,网络营销,网络优化,封丘网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01
SpringBoot拦截器可以做什么
可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等
SpringBoot拦截器实现登录拦截
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>4.0.0 org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE com.wyj springboot-interceptor01 0.0.1-SNAPSHOT springboot-interceptor01 springboot拦截器 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-thymeleaf springboot-interceptor01 org.springframework.boot spring-boot-maven-plugin
WebMvcConfigurer:继承WebMvcConfigurationSupport类,重写addInterceptors方法
/** * 在springboot2.0.0之后,WebMvcConfigurerAdapter已经过时了 * 会使用WebMvcConfigurer或者WebMvcConfigurationSupport替代 * * @author wyj * @create 2019-06-01 21:48 */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurationSupport { /** * 在springboot2.0.0之前继承WebMvcConfigurerAdapter类,重写addInterceptors方法 * * @param registry */ // @Override // public void addInterceptors(InterceptorRegistry registry) { // /** // * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行 // */ // registry.addInterceptor(new AuthorityInterceptor()) // .addPathPatterns("/user/**"); // super.addInterceptors(registry); // } /** * 在springboot2.0.0之后实现WebMvcConfigurer接口,重写addInterceptors方法 * * @param registry */ // @Override // public void addInterceptors(InterceptorRegistry registry) { // /** // * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行 // */ // registry.addInterceptor(new AuthorityInterceptor()) // .addPathPatterns("/user/**"); // } /** * 在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法 * * @param registry */ @Override protected void addInterceptors(InterceptorRegistry registry) { /** * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行 */ registry.addInterceptor(new AuthorityInterceptor()) .addPathPatterns("/user/**"); super.addInterceptors(registry); } }
AuthorityInterceptor:实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法
@Slf4j public class AuthorityInterceptor implements HandlerInterceptor { private static final SetNOT_INTERCEPT_URI = new HashSet<>();//不拦截的URI static { NOT_INTERCEPT_URI.add("/user/login.html"); NOT_INTERCEPT_URI.add("/user/login"); } /** * 在请求处理之前进行调用(Controller方法调用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { String uri = request.getRequestURI(); if (NOT_INTERCEPT_URI.contains(uri)) { log.info("不拦截" + uri); return true; } log.info("拦截" + uri); HttpSession session = request.getSession(); UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session"); if (userInfo == null) { throw new RuntimeException("用户未登陆"); } return true; } /** * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { } /** * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行 * (主要是用于进行资源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { } }
UserController:
@Controller @RequestMapping(value = "/user") public class UserController { @RequestMapping(value = "/login.html") public String index() { return "login"; } @RequestMapping(value = "/login") public String login(User user) { //查询数据库,我这里直接写死 User dbUser = new User(1, "zhangsan", "123456", "admin"); if (dbUser.getPassword().equals(user.getPassword())) { UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole()); HttpSession session = getRequest().getSession(); session.setAttribute("user_info_in_the_session", userInfo); return "admin"; } return "login"; } @RequestMapping(value = "/userInfo") @ResponseBody public String userInfo() { HttpSession session = getRequest().getSession(); UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session"); return userInfo.toString(); } private HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); } }
User:
@Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { private int id; private String username; private String password; private String role; }
UserInfo: 用于存在用户信息储存在session中
@Data @NoArgsConstructor @AllArgsConstructor public class UserInfo implements Serializable { private int id; private String username; private String role; }
login.html:只是一个很简单的登录表单
登陆页面
admin.html:
首页
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。