Java 仅使用spring安全性和servlet 2.5的Cookie http?

Java 仅使用spring安全性和servlet 2.5的Cookie http?,java,spring,servlets,cookies,Java,Spring,Servlets,Cookies,我只想使我的cookie安全,并满足http请求 我见过很多类似于post的东西,而且似乎工作得很好,但是使用的是配置文件和servlet+3 我基本上想做的是只设置cookie http,如果可能的话也只设置ssl 到目前为止,我已将其添加到web.xml中 <session-config> <session-timeout>60</session-timeout> <cookie-config>

我只想使我的cookie安全,并满足http请求

我见过很多类似于post的东西,而且似乎工作得很好,但是使用的是配置文件和servlet+3

我基本上想做的是只设置cookie http,如果可能的话也只设置ssl

到目前为止,我已将其添加到web.xml中

    <session-config>
        <session-timeout>60</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

60
真的
曲奇
什么都不做,就我阅读的内容而言,我还必须配置我的servlet.xml以启用此功能,但我不知道如何

你知道怎么做吗

编辑:


因为我使用的是servlets 2.5,所以xml配置不是一个选项,可能是一个过滤器

我相信您丢失了安全标签。尝试添加:

<secure>false</secure>
false

javagc提到的context.xml更改只会重新配置会话cookie

要更改所有Cookie,您有2个选项:

选项1)更新应用程序代码以使用更安全的方法添加cookie。例如:

选项2)您可以配置servlet过滤器来更改通过系统发送的所有(其他)cookie。在您的WAR中将这两个类添加到适当的包中。然后更新web.xml,详情如下

如果您愿意添加对OWASP库的依赖关系,OWASP站点上列出了选项2的一个简单示例。位于此处:

响应包装器 这会将http only标志添加到包装响应上的所有cookie

public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {

 public HttpOnlyResponseWrapper(HttpServletResponse res) {
   super(res);
 }

 public void addCookie(Cookie cookie) {
   StringBuilder header = new StringBuilder();
   if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
     header.append(cookie.getName());
   }
   if (cookie.getValue() != null) {
     // Empty values allowed for deleting cookie
     header.append("=" + cookie.getValue());
   }

   if (cookie.getVersion() == 1) {
     header.append(";Version=1");
     if (cookie.getComment() != null) {
       header.append(";Comment=\"" + cookie.getComment() + "\"");
     }
     if (cookie.getMaxAge() > -1) {
       header.append(";Max-Age=" + cookie.getMaxAge());
     }
   } else {
     if (cookie.getMaxAge() > -1) {
       Date now = new Date();
       now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
       SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
       header.append(";Expires=" + cookieFormat.format(now));
     }
   }

   if (cookie.getDomain() != null) {
     header.append(";Domain=" + cookie.getDomain());
   }
   if (cookie.getPath() != null) {
     header.append(";Path=" + cookie.getPath());
   }
   if (cookie.getSecure()) {
     header.append(";Secure");
   }
   header.append(";httpOnly");
   addHeader("Set-Cookie", header.toString());
 }
}
滤器 此筛选器将配置的响应包装在上述包装中

package yourpackage;

@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
 private FilterConfig config;

 @Override
 public void destroy() {
   this.config = null;
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse res,
     FilterChain chain) throws IOException, ServletException {

   HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
   chain.doFilter(req, hres);
 }

 public FilterConfig getFilterConfig() {
   return this.config;
 }

 @Override
 public void init(FilterConfig config) throws ServletException {
   this.config = config;
 }
}
改编(警告:并非完全相同!),来源:

web.xml 最后一个细节:仅当系统中关闭了注释扫描时,如下所示:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         version="2.5" ***metadata-complete="true"***>
</web-app> 
<filter>
    <filter-name>HttpOnlyFilter
    <filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
    <filter-name>HttpOnlyFilter
    <url-pattern>/*
</filter-mapping>

然后,您需要在web.xml文件中手动配置上述过滤器,如下所示:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         version="2.5" ***metadata-complete="true"***>
</web-app> 
<filter>
    <filter-name>HttpOnlyFilter
    <filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
    <filter-name>HttpOnlyFilter
    <url-pattern>/*
</filter-mapping>

HttpOnlyFilter
yourpackage.HttpOnlyFilter
HttpOnlyFilter
/*

如果您的应用程序扫描注释(默认设置),则不需要web.xml部分。

我讨厌xml配置,因此我会花一些时间查找非xml解决方案

由于Spring Security 1.3,您可以使用

server.session.cookie.http-only=true
server.session.cookie.secure=true
在application.properties文件中


也许有一种方法可以使用纯Java配置来设置,但我找不到它们。

我们最近遇到了这个问题。我只尝试了http的属性设置,这在本地有效,但在部署到测试环境时无效。环境中可能有一些默认设置覆盖了这些本地设置。工作原理是在Spring配置文件中设置属性:

@Bean
public ServletContextInitializer servletContextInitializer() {
    return new ServletContextInitializer() {
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
            SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
            sessionCookieConfig.setHttpOnly(true);
            sessionCookieConfig.setSecure(true);
        }
    };
}

在ServletContextListener的帮助下,我们可以在tomcat启动和关闭时控制servlet。因此,在tomcat启动时,我们正在设置httponly的配置

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public final class ContextListener implements ServletContextListener {

    private ServletContext context = null;
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        this.context = null;
    }
    @Override
    public void contextInitialized(ServletContextEvent event) {
        this.context = event.getServletContext();
        this.context.getSessionCookieConfig().setHttpOnly(true);

    }
}
web.xml中的Abb beloww条目

<listener>
<description>contextListener</description>
<listener-class>
        main.ContextListener 
    </listener-class>
 </listener>

上下文侦听器
main.ContextListener

谢谢,但这不会对配置造成任何影响您好,我看到了第一个选项,但不知道在哪里使用它。。。这是最好的方法吗?我看到了班级。。。但是,我将其添加到过滤器?过滤器工作平稳!只是想知道,如果不再使用xml配置,如何设置域名或secure=true?或者只是将它们硬编码到类中?XML配置仅用于会话cookie;它不适用于应用程序设置的所有cookie。如果要为应用程序设置的cookie设置域或安全值,则需要在cookie本身上设置它们。我以前使用过Cookie的一个子类来做这件事。(
公共类mycokie扩展Cookie
,在构造函数中为domain/secure设置默认值。添加调用super的getter和setter,然后确保每个人都使用它而不是Cookie。)在这个问题上,悬赏发生了什么事?我没有接受任何答案,因为他们都不起作用,悬赏的期限也已到期……“过滤器工作顺利”并不意味着答案有用吗?如果你不把你的赏金奖励给帮助你的人,你就破坏了赏金制度,人们将来也不可能帮助你。在下面的回复中添加了一些注释(这是一个不同的问题)。它会,但不会设置cookie。。。如果我没有给你奖金,我很抱歉,你必须知道,即使我没有给,奖金也会从提供奖金的积分中打折,因此,如果我没有给,是因为即使过滤器工作良好,饼干也没有…好吧,我不再帮你了,因此,我们将看到这对ya的作用。
java.lang.UnsupportedOperationException:Servlet 3.0规范的第4.4节不允许从未在web.xml中定义、未在web-fragment.xml文件中定义、也未在
event.getServletContext()处用@WebListener
注释的ServletContextListener调用此方法.getSessionCookieConfig()这些配置已弃用