java - 缓存 header 拦截器不执行任何操作 - struts2

标签 java caching struts2

我正在使用 Struts2 开发一个 Web 应用程序。用户登录、发出请求,然后注销。

当用户单击“后退”按钮(注销后)时,他不应该看到之前登录的页面,这意味着我想禁止浏览器缓存。我为此添加了一个拦截器:

public class CachingHeadersInterceptor extends AbstractInterceptor{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // TODO Auto-generated method stub

        final ActionContext context = invocation.getInvocationContext();
        HttpServletResponse response = (HttpServletResponse)context.get(StrutsStatics.HTTP_RESPONSE);
        if(response!=null){
            response.setHeader("Cache-control", "no-cache, no-store");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Expires", "-1");

        }

        return invocation.invoke();
    }

}

此条目位于 struts.xml文件:

 <interceptors>

       <interceptor name="cachingHeadersInterceptor" class="com.proconsulto.interceptor.CachingHeadersInterceptor"/>
       <interceptor-stack name="defaultSecurityStack">
       <interceptor-ref name="defaultStack"/>
       <interceptor-ref name="cachingHeadersInterceptor"/>
       </interceptor-stack>

       </interceptors>

但是注销后,当我单击“后退”按钮时,我仍然可以访问该登录页面。

我的代码缺少什么?我按照在线教程编写了这段代码。

这是异常跟踪:

WARNING: Unable to load config class com.proconsulto.interceptor.CachingHeadersInterceptor at interceptor - file:/C:/Users/AnkitaNallana/Desktop/OneMoreTime/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ProConsulto%20-%20Everything%20is%20fine%20-%20v16/WEB-INF/classes/struts.xml:21:117 probably due to a missing jar, which might be fine if you never plan to use the cachingHeadersInterceptor interceptor
Jul 08, 2014 3:21:26 PM com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
SEVERE: Actual exception
Caught Exception while registering Interceptor class com.proconsulto.interceptor.CachingHeadersInterceptor - interceptor - file:/C:/Users/AnkitaNallana/Desktop/OneMoreTime/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ProConsulto%20-%20Everything%20is%20fine%20-%20v16/WEB-INF/classes/struts.xml:21:117
    at org.apache.struts2.impl.StrutsObjectFactory.buildInterceptor(StrutsObjectFactory.java:77)
    at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:70)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.lookupInterceptorReference(XmlConfigurationProvider.java:1101)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStack(XmlConfigurationProvider.java:919)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptorStacks(XmlConfigurationProvider.java:932)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadInterceptors(XmlConfigurationProvider.java:955)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:524)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:292)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:250)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:429)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:473)
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4584)
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5262)
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5257)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassNotFoundException: com.proconsulto.interceptor.CachingHeadersInterceptor
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
    at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:152)
    at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108)
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:161)
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
    at org.apache.struts2.impl.StrutsObjectFactory.buildInterceptor(StrutsObjectFactory.java:52)
    ... 26 more

为了更加确定,我复制并粘贴了包和类名十几次,我仍然不知道为什么我得到 ClassNotFoundException !

另一种方法是将其编写为 JSP <% response.setHeader("xxx","vvv") %>每个页面上都有标签。那会非常乏味。我不想使用 JS 禁用它,因为这会导致糟糕的用户体验。

我还注意到另一件事。当我使用<% response.setHeader("xxx","vvv") %>时在几个 JSP 上添加标签,然后单击“后退”按钮,将显示一个“重新加载”按钮(在 Chrome 上) - 如果单击它 - 登录数据将被提交,并且可以再次查看登录页面。我该怎么做才能不存储此登录数据以供重新提交?

如果有我可能没有遇到过的类似问题 - 请在评论中提及其链接。我找不到答案,所以我在这里提问!

最佳答案

例子总是比理论更能证明......

编辑:我只是向您展示一个演示。

package com.interceptors;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class CachingHeadersInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;

public String intercept(ActionInvocation invocation) throws Exception {

    if (ServletActionContext.getResponse() != null) {
        ServletActionContext.getResponse().setHeader("Cache-control",
                "no-cache, no-store, must-revalidate");
        ServletActionContext.getResponse().setHeader("Pragma", "no-cache");
        ServletActionContext.getResponse().setHeader("Expires", "-1");
        ServletActionContext.getResponse().setHeader("Vary", "*");
    }
    return invocation.invoke();
}

}

struts.xml

<package name="helloworld" namespace="" extends="struts-default">
   <interceptors>
     <interceptor name="cachingHeadersInterceptor" class="com.interceptors.CachingHeadersInterceptor"/>
     <interceptor-stack name="defaultSecurityStack">
         <interceptor-ref name="defaultStack"/>
         <interceptor-ref name="cachingHeadersInterceptor"/>
     </interceptor-stack>
   </interceptors>
   <action name="login" class="com.common.LoginAction" >
         <interceptor-ref name="defaultStack"/>          
         <interceptor-ref name="cachingHeadersInterceptor"/>

        <result name="success">/Home.jsp</result>
   </action>
  </package>

输出:这是在响应 header 中

Cache Header Output

注销后,如果您想阻止用户查看页面,您可以实现 Authorizeinterceptor

引用:参见 AuthorizationInterceptor.java 的示例

在此拦截器中,只需检查 session 值,例如用户名,注销后将为空,如果为空则重定向到登录。

您可以创建新的拦截器,也可以将以下代码放入同一个 CachingHeadersInterceptor.java

SessionMap<String,Object> map = (SessionMap<String,Object>) inv.getInvocationContext().getSession();
Object user = map.get("username");  
if(user==null ||user.equals("") || map.isEmpty() || map == null ){  
  return "login";   
}

struts.xml中将登录定义为重定向到登录页面的结果。

<global-results>
    <result name="login">login.jsp</result>
</global-results>

另请参阅LoginAction.javaLogoutAction.java我在 session 中添加和删除了用户名

很简单......:)

关于java - 缓存 header 拦截器不执行任何操作 - struts2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595315/

相关文章:

java - jqGrid 无法使用 @Transactional 加载

java - 使用 Glide,ArrayList 在 ViewPager 中重复自身?

java - 如何从System.in读取数据来解决任务?

css - 如何处理 GWT 主题 CSS 文件的缓存

c# - 使用 ImmutableSortedSet<T> 进行线程安全缓存

java - 当我点击 <s :url> with params I have a Unexpected exception in class ActionSupport in Struts2 时

java - Jsp 上的 Struts2-菜单

java - 递归(返回语句)

javascript - 从 Struts 2 获取值到 AngularJS

java - EhCache Spring优化