gpt4 book ai didi

java - 缓存 header 拦截器什么都不做 - struts2

转载 作者:行者123 更新时间:2023-11-30 08:22:12 27 4
gpt4 key购买 nike

我正在使用 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>

输出:这是在响应头中

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com