【问题标题】:logout form using cookies servlets jsp [duplicate]使用cookie servlets jsp的注销表单[重复]
【发布时间】:2016-10-25 07:24:59
【问题描述】:

我正在尝试在 java 中制作一个注销表单,并且我正在使用 cookie。但问题是,当我点击后退按钮时,它会将我重定向到我不想要的最后一个安全页面。

这是我的代码: 小服务程序:

 @WebServlet(name="LogOut", urlPatterns={"/LogOut"})
public class LogOut extends HttpServlet {
 protected void doPost(HttpServletRequest req, HttpServletResponse response1)  
       throws ServletException, IOException {


    Cookie[] cookies = req.getCookies();
    if(cookies != null){
    for(Cookie cookie : cookies){
        if(cookie.getName().equals(req.getSession().getAttribute("email"))){
            System.out.println( req.getSession().getAttribute("email") +cookie.getValue());
        }
        cookie.setMaxAge(0);
        response1.addCookie(cookie);
    }
    }
     //invalidate the session if exists
     HttpSession session = req.getSession(false);
     System.out.println("User="+req.getSession().getAttribute("email"));
     if(session != null){
        session.invalidate();
    }
     //no encoding because we have invalidated the session
     response1.sendRedirect("index.html");
 }
}



filter:



    @WebFilter("/NoCacheFilter")
public class NoCacheFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        response.setDateHeader("Expires", 0); //Proxies. 

        chain.doFilter(req, res);
    }
}

jsp:

<form action="logout" method="post">
                        <a><button type = "submit" class = "myprofile>Deconectare</button></a>
</form>

web.xml:

  <servlet>
    <servlet-name>logout</servlet-name>
    <servlet-class>user.LogOut</servlet-class>
 </servlet>
 <filter>
    <filter-name>nocachefilter</filter-name>
    <filter-class>user.NoCacheFilter</filter-class>
 </filter>
 <filter-mapping> 
   <filter-name>nocachefilter</filter-name>
   <url-pattern>/logout</url-pattern> 
</filter-mapping> 
<servlet-mapping>
    <servlet-name>logout</servlet-name>
    <url-pattern>/logout</url-pattern>
</servlet-mapping>

有人可以帮我吗?谢谢!

【问题讨论】:

    标签: java jsp servlets cookies


    【解决方案1】:

    问题是当你点击返回按钮时,页面是从缓存而不是浏览器加载的。 您可以使用此答案提供的解决方案来避免从缓存中加载:

    Prevent user from seeing previously visited secured page after logout

    您的 servlet 和过滤器应该是两个不同的类。 在您的情况下,您使用的是与 Servlet 和 Filter 相同的类。

      <servlet-class>user.LogOut</servlet-class>
      <filter-class>user.LogOut</filter-class>
    

    创建一个 Servlet 类..以及该类的 cookie 逻辑。

       public class LogOutServlet extends HttpServlet{
    
            protected void doPost(HttpServletRequest req,
                 HttpServletResponse response1) throws ServletException, IOException {
                   Cookie[] cookies = req.getCookies();
                  if (cookies != null) {
                  for (Cookie cookie : cookies) {
                         if(cookie.getName().equals(req.getSession().getAttribute("email"))) {
                         System.out.println(req.getSession().getAttribute("email")
                            + cookie.getValue());
                }
                cookie.setMaxAge(0);
                response1.addCookie(cookie);
             }
        }
    }
    

    你的 web.xml 为: 您必须分别为每个过滤器和 servlet 指定过滤器映射和 servlet-mapping 元素。在您的文件中,logout servlet 缺少 servlet-mapping,filter 缺少 filter-mapping。

     <servlet>
        <servlet-name>logout</servlet-name>
        <servlet-class>user.LogOut</servlet-class>
     </servlet>
     <filter>
        <filter-name>nocachefilter</filter-name>
        <filter-class>user.NoCacheFilter</filter-class>
     </filter>
     <filter-mapping> 
       <filter-name>nocachefilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping> 
    <servlet-mapping>
        <servlet-name>logout</servlet-name>
        <url-pattern>/logout</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 当我尝试像您的示例那样实现时,我的整个程序都不起作用。 Err:'Starting Tomcat Server at localhost 遇到问题。Server Tomcat Sever at local host failed to start'.
    • 您是否正确地更改了 web.xml 文件?启动tomcat时有什么异常?
    • 我已经更新了我的问题。你能看看吗?我的例外是:org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext [/e-health_nutrition]];原因:java.lang.IllegalArgumentException: Invalid acasa.jsp in filter mapping
    • &lt;filter&gt; &lt;filter-name&gt;LogOutFilter&lt;/filter-name&gt; &lt;filter-class&gt;user.LogOut&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;LogOutFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/logout&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;servlet&gt; &lt;servlet-name&gt;logout&lt;/servlet-name&gt; &lt;servlet-class&gt;user.LogOut&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;logout&lt;/servlet-name&gt; &lt;url-pattern&gt;/logout&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; 你可以试试这个!另外,删除注释。使用 web.xml 映射或注释!
    • 我进行了更改,但是如何在我的 jsp 中调用此过滤器?
      我试过了,但没用: user.LogOut 不能转换为 javax.servlet.Servlet 我也更新了我的问题,看看我实现了什么
    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2015-04-01
    • 2011-07-28
    • 2012-12-18
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多