使用Filter拦截器如何实现请求跨域转发
目录
- Filter拦截器实现请求跨域转发
- 在使用Filter实现转发后特做一次记录
- 使用filter解决跨域
- 在web.xml配置拦截器
- 过滤器代码
Filter拦截器实现请求跨域转发 因为公司项目需求,项目中前端请求需要通过一个类似中转的服务转发(请求在该服务中会重新包装一些通用参数)
在使用Filter实现转发后特做一次记录
package com.unicloud.cce.Filter; import com.alibaba.fastjson.JSON; import com.unicloud.cce.common.RestfulEntity; import com.unicloud.cce.service.CloudosService; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.*; /** * @author skyxt * Created 2019-06-11 18:46 * Email skyxt.yang@gmail.com */@WebFilter(filterName = "authFilter", urlPatterns = { "/*" })@Componentpublic class RequestFilter implements Filter { //该处配置需要转发的路径public static final Set FILTER_URL = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("/config/*"))); @Autowiredprivate RestTemplate restTemplate; @Autowiredprivate CloudosService cloudosService; private final static Logger logger = LoggerFactory.getLogger(RequestFilter.class); @Overridepublic void init(FilterConfig filterConfig) throws ServletException { } @Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {return; }HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rsp = (HttpServletResponse) response; AntPathMatcher matcher = new AntPathMatcher(); Optional cloudIp = Optional.empty(); //for (String url : FILTER_URL) {//if (matcher.match(url, req.getRequestURI().substring(req.getContextPath().length()))) {//cloudIp = cloudosService.cloudosList("", "").stream().filter(cloudos ->//cloudos.getId().equals(((HttpServletRequest) request).getHeader("cloudId"))//).map(Cloudos::getCloudIp).findFirst(); //}//}cloudIp = Optional.of("localhost"); if (cloudIp.isPresent()) {switch (req.getMethod()) {case "GET": {request(req, rsp, HttpMethod.GET, cloudIp.get()); break; }case "POST": {request(req, rsp, HttpMethod.POST, cloudIp.get()); break; }case "PUT": {request(req, rsp, HttpMethod.PUT, cloudIp.get()); break; }case "PATCH": {request(req, rsp, HttpMethod.PATCH, cloudIp.get()); break; }case "DELETE": {request(req, rsp, HttpMethod.DELETE, cloudIp.get()); break; }default:{logger.error("unknow request method:" + req.getMethod()); rsp.setCharacterEncoding("UTF-8"); try (PrintWriter out = rsp.getWriter()) {out.write("请求方法未知"); } catch (Exception e1) {logger.error(e1.getMessage() + e1); }} }} else {chain.doFilter(request, response); }} @Overridepublic void destroy() { } private void request(HttpServletRequest req, HttpServletResponse rsp, HttpMethod method, String cloudIp) throws IOException {rsp.setCharacterEncoding("UTF-8"); String requestBody = IOUtils.toString(req.getInputStream(), "UTF-8"); Object body = null; if (StringUtils.hasText(requestBody)) {body = JSON.parse(requestBody); }HttpHeaders headers = new HttpHeaders(); Enumeration headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) {String name = headerNames.nextElement(); headers.add(name, req.getHeader(name)); }String url; if (StringUtils.hasText(req.getQueryString())) {url = String.format("http://%s:15120%s?%s",cloudIp,req.getRequestURI().substring(req.getContextPath().length()),req.getQueryString()); } else {url = String.format("http://%s:15120%s",cloudIp,req.getRequestURI().substring(req.getContextPath().length())); }HttpEntity
使用filter解决跨域
在web.xml配置拦截器
servletFilterTest cn.test.intercepter.ServletFilterTest servletFilterTest /*
过滤器代码
import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletFilterTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; httpServletRequest.getSession(); HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; httpResponse.setHeader("Access-Control-Allow-Origin", "*"); httpResponse.setHeader("Access-Control-Allow-Methods", "*"); httpResponse.setHeader("Access-Control-Max-Age", "3600"); httpResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Content-type", "application/json"); httpResponse.setHeader("Cache-Control", "no-cache, must-revalidate"); if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {return ; }filterChain.doFilter(httpServletRequest, httpResponse); }@Overridepublic void destroy() {}}
【使用Filter拦截器如何实现请求跨域转发】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小