关系图Filter-过滤器●在web应用启动的时候初始化一次, 在web应用停止的时候销毁 2、 HttpServletRequestWrapper
@Slf4j public class RequestWrapper extends HttpServletRequestWrapper { public RequestWrapper(HttpServletRequest request) { super(request); log.info("RequestWrapper"); } @Override public String getParameter(String name) { // 可以对请求参数进行过滤 return super.getParameter(name); } @Override public String[] getParameterValues(String name) { // 对请求参数值进行过滤 String[] values =super.getRequest().getParameterValues(name); return super.getParameterValues(name); } } 3、配置过滤器 /** * 过滤器配置类 * */ @Configuration public class FilterConfig { @Bean public RequestFilter requestFilter(){ return new RequestFilter(); } /** * 过滤器注册 */ @Bean public FilterRegistrationBean<RequestFilter> registrationBean() { FilterRegistrationBean<RequestFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(requestFilter()); registrationBean.addUrlPatterns("/filter/*"); registrationBean.setName("RequestFilter"); //过滤器的级别,值越小级别越高越先执行 registrationBean.setOrder(1); return registrationBean; } } Interceptor—拦截器●实现 org.springframework.web.servlet.HandlerInterceptor 接口,动态代理 1、登录拦截 @Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user = (User)request.getSession().getAttribute("user"); if (!ObjectUtils.isEmpty(user)) { // 存在用户信息,即用户已登录 return true; } else { // 不管是转发还是重定向,必须返回false。否则出现多次提交响应的错误 redirect(request, response); return false; } } /* * 对于请求是ajax请求重定向问题的处理方法 * @param request * @param response * */ public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException { if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){// ajax //获取当前请求的路径 response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTENT_PATH"); //告诉ajax我是重定向 response.setHeader("REDIRECT", "REDIRECT"); //告诉ajax我重定向的路径 StringBuffer url = request.getRequestURL(); String contextPath = request.getContextPath(); response.setHeader("CONTENT_PATH", url.replace(url.indexOf(contextPath) + contextPath.length(), url.length(), "/").toString()); }else{// http response.sendRedirect( "/page/login"); } response.getWriter().write(403); response.setStatus(HttpServletResponse.SC_FORBIDDEN); } } 2、拦截器配置 @Configuration public class WebMvcConfigurer implements WebMvcConfigurer { /* * 拦截器依赖于Spring容器,此处拦截了所有,需要对静态资源进行放行 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。 // registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**").order() registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**") .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**"); } /* * 不要要写控制器即可完成页面跳转访问 * @param registry */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/page/ajax").setViewName("ajax"); } // @Override // public void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); //registry.addResourceHandler("/static/**").addResourceLocations("file:E:/static/"); // } } |
|