Spring Boot配置拦截器及实现跨域访问的方法

网友投稿 499 2023-01-17


Spring Boot配置拦截器及实现跨域访问的方法

拦截器功能强大,能够深入方法前后,常应用于日志记录、权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现Spring Boot自定义拦截器的配置。

理论指导

问:SpriUnipNZyVXUng Boot怎么配置拦截器?

答:配置一个拦截器需要两步完成。

自定义拦截器,实现HandlerInterceptor这个接口。这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作。

注册拦截器。 作用是确定拦截器和拦截的URL。需要继承WebMvcConfigurationSupport并重写addInterceptor方法,WebMvcConfigureAdapter已经过时了!!

代码实现

目录结构:

具体代码:

MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {

/**

* preHandle在执行Controller之前执行,返回true,则继续执行Contorller

* 返回false则请求中断。

*/

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)

throws Exception {

//只有返回true才会继续向下执行,返回false取消当前请求

long startTime = System.currentTimeMillis();

httpServletRequest.setAttribute("startTime", startTime);

return true;

}

/**

* postHandle是在请求执行完,但渲染ModelAndView返回之前执行

*/

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,

ModelAndView modelAndView) throws Exception {

long startTime = (Long) httpServletRequest.getAttribute("startTime");

long endTime = System.currentTimeMillis();

long executeTime = endTime - startTime;

StringBuilder sb = new StringBuilder(1000);

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String date = simpleDateFormat.format(new Date());

sb.append("-----------------------").append(date).append("-------------------------------------\n");

sb.append("URI : ").append(httpServletRequest.getRequestURI()).append("\n");

sb.append("CostTime : ").append(executeTime).append("ms").append("\n");

sb.append("-------------------------------------------------------------------------------");

System.out.println(sb.toString());

}

/**

* afterCompletion是在整个请求执行完毕后执行

*/

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,

Object o, Exception http://e) throws Exception {

}

}

RegisterInterceptor.java

/**

* 继承WebMvcConfigurationSupport继承并重写addInterceptor方法用于注册拦截器

* WebMvcConfigureAdapter已经过时了!!

*/

@Configuration

public class RegisterInterceptor extends WebMvcConfigurationSupport {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new MyIUnipNZyVXUnterceptor()).addPathPatterns("/**");

super.addInterceptors(registry);

}

}

拦截效果

更新

跨域访问

由于javascript同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。具体的看下表

URL

说明

是否允许通信

http://a.com/a.js

http://a.com/b.js

同一域名下

允许

http://a.com/lab/a.js

http://a.com/script/b.js

同一域名下不同文件夹

允许

http://a.com:8000/a.js

http://a.com/b.js

同一域名,不同端口

不允许

http://a.com/a.js

https://a.com/b.js

同一域名,不同协议

不允许

http://a.com/a.js

http://70.32.92.74/b.js

域名和域名对应ip

不允许

http://a.com/a.js

http://script.a.com/b.js

主域相同,子域不同

不允许

http://a.com/a.js

http://a.com/b.js

同一域名,不同二级域名(同上)

不允许(cookie这种情况下也不允许访问)

http://cnblogs.com/a.js

http://a.com/b.js

不同域名

不允许

上面代码是可以实现拦截器基本功能,但是这样是不可以跨域访问的,前端请求接口会有报错:XMLHttpRequest cannot loadhttp://xxx/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

解决方案是设置请求头Access-Control-Allow-Origin为“*”或者设置为和request相同的Origin。

①在拦截器中添加一个设置请求头的方法。

public void crossDomain(HttpServletRequest request, HttpServletResponse response) {

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

response.setHeader("Access-Control-Allow-Credentials", "true");

}

②在preHandle中调用这个方法。

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

crossDomain(request, response);

long startTime = System.currentTimeMillis();

request.setAttribute("startTime", startTime);

return true;

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实现接口用空心三角形(空心三角形和实心三角形)
下一篇:如何做接口接入管理工具(接口管理工具有哪些)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~