如何在java中为servlet 2.5设置Httponly和安全标志到cookie

时间:2016-06-07 08:22:11

标签: java security servlets cookies

您好我正在尝试将Httponly和安全标志添加到我的Cookie中。这就是我试过的

public static void addCookie(HttpServletRequest request,HttpServletResponse response) 
        {

            Cookie[] cookie = request.getCookies();

            for(int i=0;i<cookie.length;i++)
            {
                System.out.println(cookie[i].toString());
                System.out.println("cookie Name :"+cookie[i].getName());
                System.out.println("cookie value :"+cookie[i].getValue());
                cookie[i].setSecure(true);

                System.out.println("Secure :"+cookie[i].getSecure());

            }

在上面的代码中,我刚刚将secure设置为true。现在当使用萤火虫看天气饼干被设置为安全或不安全我只是看到 response in firebug

为什么我的cookie不安全?

现在另一个标志Httponly,我如何将我的cookie设置为httponly标志。

当我使用eclipse编写代码时,eclipse给出了一个方法

的建议
cookie[i].setHttpOnly(true);

enter image description here

但是当我运行代码时,我得到错误说。

  

java.lang.NoSuchMethodError:javax.servlet.http.Cookie.setHttpOnly(Z)V

我看到了javax.servlet.http.Cookie类规范,我没有看到任何调用的方法 http://docs.oracle.com/javaee/1.4/api/javax/servlet/http/Cookie.html

cookie[i].setHttpOnly(true);

如何保护我的Cookie?

我尝试了多种解决方案但是工作。 我试过这个

String sessionid = req.getSession().getId();
res.setHeader("Set-Cookie", "JSESSIONID=" +  sessionid + ";HttpOnly");
res.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; secure");

更新1 我也尝试了这个

<session-config>
  <cookie-config>
    <secure>true</secure>
    <http-only>true</http-only>
  </cookie-config>
</session-config>

但它适用于servlet 3.0,它不适用于2.5 @Jarrod Roberson可以请你重新打开我的问题。

当我在web.xml中编写上述解决方案时 我收到了轰鸣声错误

cvc-complex-type.2.4.a: Invalid content was found starting with element 'cookie-config'. One of '{"http://
 java.sun.com/xml/ns/javaee":session-timeout}' is expected.

更新2 因为我已经搜索了很多,我看到了同样的解决方案。 它在Servlet 3.0中引入,在旧版本(如2.5)中不受支持。您的web.xml声明符合Servlet 2.5。 请参阅BalusC的答案 web.xml validation in Weblogic throws error because of cookie-config

更新3

这正是我在波纹管链接中所做的所做的 Suggested link

web.xml

中输入
<filter>
  <filter-name>Security Filter</filter-name>
    <filter-class>com.globalss.dnb.monitor.security.SecurityFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>Security Filter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>  

SecurityFilter类

public class SecurityFilter implements Filter {



     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // wrap the response
            response = new SecureCookieSetter((HttpServletResponse)response);

            // touch the session
            ((HttpServletRequest) request).getSession();

            // overwriting the cookie with Secure attribute set
            ((HttpServletResponse)response).setHeader("Set-Cookie", "JSESSIONID=" + ((HttpServletRequest)request).getSession().getId() + ";Path=/");
        }


    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }
}

SecureCookieSetter类

public class SecureCookieSetter extends HttpServletResponseWrapper  {

    public SecureCookieSetter(HttpServletResponse  response) {
        super(response);
    }

    @Override
    public void addCookie(Cookie cookie) {
        cookie.setSecure(true);
        super.addCookie(cookie);
    }

    @Override
    public void addHeader(String name, String value) {
        if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) {
            value = value + ";Secure";
        }
        super.addHeader(name, value);
    }

    @Override
    public void setHeader(String name, String value) {
        if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) {
            value = value + ";Secure";
        }
        super.setHeader(name, value);
    }
}

执行此操作后,当我运行我的服务器时,现在我无法访问我的应用程序的任何页面,但我没有收到任何错误。

更新4

正如所建议的那样,我添加了BaluC建议的这条线。我能够运行该应用程序,但我没有看到HttpOnly标志。

enter image description here

请帮忙

0 个答案:

没有答案