【问题标题】:JSF reset backing beans when back is pressed RequestScopedJSF 在按下返回时重置支持 bean RequestScoped
【发布时间】:2013-10-03 08:01:53
【问题描述】:

我有一个简单的 web 应用程序,用户可以在其中创建具有角色的其他用户,出于安全目的,我想要的是在用户(管理员角色)创建另一个用户之后,它会进入欢迎页面,并且当用户在 web 浏览器中按下返回按钮时, 用户可以看到输入文本框中的所有值我想在用户按下返回时重置输入文本框的值或者当用户按下返回按钮时上一页过期

谢谢。

【问题讨论】:

  • 如果 bean 是 @RequestScoped 你应该没有问题,因为 bean 只为请求存储信息。但是,您确定问题不在于您的浏览器提醒表单值吗?
  • 好吧,即使我的浏览器从值缓存它也必须在从浏览器按下后退按钮时重置 bean,或者至少给出会话过期消息。
  • 正如我所说,如果 bean 是请求范围的,那么它的生命周期只针对一个请求。 Bean 值是在表单发送期间设置的,因此当用户输入表单值时,bean 根本不会获取表单值,直到他按下提交按钮。所以按下后退按钮将撤消一切。
  • 是的,当用户按下返回提交值后,它会显示所有值,即使它没有从服务器端获取。

标签: jsf-2 primefaces


【解决方案1】:

您需要关闭浏览器的自动完成功能。这是在表单输入中使用autocomplete 属性完成的:

<h:form>
    <h:inputText value="#{auth.username}" required="true" autocomplete="off" />
    <h:inputSecret value="#{auth.password}" required="true" autocomplete="off" />
    <h:commandButton value="Login" action="#{auth.login}" />
    <h:messages />
</h:form>

看看this。

【讨论】:

    【解决方案2】:

    首先,您应该使用过滤器来确保安全。在您的过滤器中,您可以设置响应的标题。这将处理您的安全问题。一个简单的实现将是这样的:

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebFilter(urlPatterns = {"yourUrlThatWillbeProtected"})
    //you should also put dispatcherTypes in webFilter
    public class PageFilter implements Filter {
    
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }
    
    
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
    
    
            //do some filtering , take user, check user, etc.
    
            HttpServletResponse res = (HttpServletResponse) response;
            // security of closed pages
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
            chain.doFilter(request, response);
    
    
    }
    
    @Override
    public void destroy() {
    }
     }
    

    【讨论】:

    • 感谢它在 IE 8 和 Firefox 上有效,但在 Chrome 上无效
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2015-07-03
    • 2012-03-16
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多