话不多说,直接上货!
拦截器的作用
拦截器提供了一种机制,在访问action前后进行一些操作,因为拦截器的这个特性,那么我们就可以利用拦截器做一些事情,比如监控访问人数,拦截一些非法请求,记录访问日志,身份验证之类的
构建拦截器
2.1 创建拦截器
1.创建类实现HandlerInterceptor接口
2.HandlerInterceptor有三种拦截方式
`preHandle` :在访问controller调用之前
`postHandle` :请求访问controller之后,渲染视图之前
`afterCompletion` :请求访问controller之后,渲染视图之后
3.返回值为boolean
true: 请求在经过验证校验以后,是OK的,是可以放行的
false: 请求被拦截,被驳回,验证出现问题
代码示例:
package com.imooc.interceptor;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.OutputStream;import static com.imooc.controller.BaseController.REDIS_USER_TOKEN;public class UserTokenInterceptor implements HandlerInterceptor { /** * 拦截请求,在访问controller调用之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进入拦截器"); /** * false: 请求被拦截,被驳回,验证出现问题 * true: 请求在经过验证校验以后,是OK的,是可以放行的 */ return true; } /** * 请求访问controller之后,渲染视图之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /** * 请求访问controller之后,渲染视图之后 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}
2.2 注册拦截器
1.创建类实现WebMvcConfigurer接口
2.注册创建的拦截器
@Bean public UserTokenInterceptor userTokenInterceptor() { return new UserTokenInterceptor(); }
3.重写addInterceptors 添加监听的路径
addPathPatterns 添加监听的路径地址
excludePathPatterns 排除一些路径
代码示例:
package com.imooc.config;import com.imooc.interceptor.UserTokenInterceptor;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Bean public UserTokenInterceptor userTokenInterceptor() { return new UserTokenInterceptor(); } /** * 注册拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userTokenInterceptor()) .addPathPatterns("/hello") .addPathPatterns("/shopcart/add") .addPathPatterns("/shopcart/del") .addPathPatterns("/address/list") .addPathPatterns("/address/add") .addPathPatterns("/address/update") .addPathPatterns("/address/setDefalut") .addPathPatterns("/address/delete") .addPathPatterns("/orders/*") .addPathPatterns("/center/*") .addPathPatterns("/userInfo/*") .addPathPatterns("/myorders/*") .addPathPatterns("/mycomments/*") .excludePathPatterns("/myorders/deliver") .excludePathPatterns("/orders/notifyMerchantOrderPaid"); WebMvcConfigurer.super.addInterceptors(registry); }}
拦截器错误信息返回前端
因为拦截器返回的结果是布尔类型的,所有不能直接返回信息,那怎么办呢,我们可以利用output输出流来写入response中,这样前台就可以获取到了。
代码如下:
public void returnErrorResponse(HttpServletResponse response, String result) { OutputStream out = null; try { response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(result.getBytes("utf-8")); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } }
原文链接:
https://blog.csdn.net/qq_38446413/article/details/105819433
更多精彩推荐
☞我们想研发一个机器学习框架,6 个月后失败了
☞生产型机器学习已经没那么困难了?
☞视频 | 你不知道的"开源"60年秘史
☞GitHub标星10,000+,Apache项目ShardingSphere的开源之路
☞阿里技术专家告诉你,如何画出优秀的架构图?
☞加拿大API平台如何做到30%为中国明星项目?创业老兵这样说……
你点的每个“在看”,我都认真当成了喜欢