繁体   English   中英

在Java中的url中设置标头的最佳方法是什么

[英]what is the best way to set headers in url in Java

我有以下豆

    public Sample{

    @Value
    private String accoutName;

    @Value
    private String url;

    private String password; //

    @PostConstruct
        public void retrievePassword(){
             String serviceURL = url+ "?accountName=" //I have few more paramaters
             URL obj = new URL(serviceURL);
             HttpsURLConnection connection = null;= (HttpsURLConnection) obj.openConnection();
             password = readResponse(connection);//inside this i have bufferreader n all

        }
    }

}

我触发了HTTP请求并获取了响应,并将其存储在密码中。

1)如何确保该实例变量是安全的? 我尝试将其设置为最终版本,但出现错误“变量密码可能尚未初始化”,将从应用程序上下文中定义的其他bean访问此密码变量

2)如果我必须设置很多...最好的方法是设置标题...我不想硬编码。 谢谢

这里有很多未知数。 但是,下面列出了一个好的开始:

  1. 密码字段不能是最终的,因为您将从HTTP调用中检索值。 更好的选择是将字段设为私有,并为getter提供适当的访问修饰符。

  2. 为避免重复HTTP调用,您可以创建实际上进行HTTP调用的BaseClass或UtilityClass。 在调用此方法时,发送您的URI和其他POST参数。 并使其成为Singleton类。

您可以使用URI构建器。 看一下这个例子:

URI uriBuilder = new URIBuilder()
        .setScheme("http")
        .setHost(hostVar)
        .setPath(pathVar)
        .setParameter("parameter1", parameter1Value)
        .setParameter("parameter2", parameter2Value)
        .build();

一旦构建了URL,就可以获取字符串值以将其用于HTTP调用。

String url = uriBuilder.toString();

要设置标题,可以在web.xml中设置过滤器和过滤器映射,如下所示:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>com.***.CorsFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在此,针对每个请求(使用/ *)都将调用此过滤器。 您可以指定要在其上调用过滤器的任何自定义路径。

并创建一个过滤器实现,在其中可以指定所需的所有标头和可接受的请求方法,如下所示:

@Component
public class CorsFilter implements Filter {
    private static final Logger logger = LoggerFactory.getLogger(CorsFilter.class);

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        logger.info("Filters CORS request");
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        if(!(request.getMethod().equalsIgnoreCase("PUT")||request.getMethod().equalsIgnoreCase("DELETE"))){
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
            response.setHeader("Access-Control-Max-Age", "2592000");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with, content-type, sessionId, x-token,Set-Cookie,Access-Control-Allow-Credentials");
            response.setHeader("Set-Cookie", "sessionId=" +request.getSession().getId() +"; path=/appname; secure; HttpOnly; domain="+Constants.DOMAINURL);
            response.setHeader("Access-Control-Expose-Headers", "sessionId, x-token");
            response.addHeader("Cache-Control", "max-age=2592000");
            response.setDateHeader("Expires", System.currentTimeMillis() + 2592000000L); // 1 month in future.
            response.setDateHeader("Last-Modified", new Date().getTime());
            response.setHeader("X-Frame-Options", "DENY");
            response.setHeader("X-XSS-Protection", "1; mode=block");
            response.setHeader("X-Content-Type-Options", "nosniff");

            boolean isSendRedirect = false;
            if( !isSendRedirect)
                chain.doFilter(req, res);
          }


        logger.info("Filters CORS request");
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM