在下面的动作类中,我使用的是参数拦截器.
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable
{
private static final long serialVersionUID = 1L;
private String param1;
private String param2;
//Getters and setters.
public TestAction() {}
@Action(value = "TestMessage",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={
@InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insert() {
// Do something. Add or update a row to …
Run Code Online (Sandbox Code Playgroud) 我试图通过实现SessionAware
接口(我已经实现了该setSession
方法)从拦截器内访问会话对象,但我无法以这种方式获取会话对象。
然后我尝试ActionContext.getContext().getSession()
并且能够获得会话,但我不知道,但它在每个用户的每个浏览器中第一次都是空的,然后当调用另一个操作时它会被填充。
我认为会议出了问题。为什么它只是第一次给我一个空会话?它是否仅在第一次提供空会话后才设置某些内容?
如果是这种情况,那么每个人都会在第一次请求时显示为访客,然后在第二次请求时显示用户名,如此下去。
或者我以错误的方式获得会议?
我看到了在拦截器中获取会话的代码,但这对我不起作用,因为它找不到常量HTTP_REQUEST
。
final ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
HttpSession session = request.getSession(true);
Object user = session.getAttribute(Constants.USER_HANDLE);
Run Code Online (Sandbox Code Playgroud)
对于解决任何问题有什么建议吗?
我忘了提一下 - 我的网站是一个安全网站(https),所以如果用户没有登录,它不会让他进入网站,如果他登录了,至少他的用户名应该在会话中。难道不应该吗?
我将一些参数传递给ModelDriven<Transporter>
通过查询字符串实现的动作类.
<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm">
<s:url id="editURL" action="EditTest" escapeAmp="false">
<s:param name="transporterId" value="1"/>
<s:param name="transporterName" value="'DHL'"/>
</s:url>
<s:a href="%{editURL}">Click</s:a>
</s:form>
Run Code Online (Sandbox Code Playgroud)
动作类如下.
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport
implements Serializable, Preparable, ModelDriven<Transporter>
{
private static final long serialVersionUID = 1L;
private Transporter transporter = new Transporter();
@Action(value = "Test",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack",
params = {"params.acceptParamNames", "transporterId, …
Run Code Online (Sandbox Code Playgroud) java model-driven struts2 interceptorstack struts2-interceptors
我在我的struts.xml和所有表单中添加了一个拦截器,以防止跨站点请求伪造攻击.我想知道我是否还应该做其他事情?比如检索令牌并与提交的表格一起匹配表格,以防它不会自动完成.
<interceptors>
<interceptor-stack name="defaultSecurityStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="tokenSession">
<param name="excludeMethods">*</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultSecurityStack"/>
Run Code Online (Sandbox Code Playgroud)
所有表格都有
<s:form ...>
<s:token/>
...
</s:form>
Run Code Online (Sandbox Code Playgroud) 我有一个动作,我试图登录用户.
public class RegisteredUserAction extends ActionSupport implements SessionAware {
..
..
public String login() throws Exception {
DBLogic dBLogic = new DBLogic();
RegisteredUser user = null;
try {
user = dBLogic.getRegisteredUser(getUserUsername(), getUserPassword());
} catch (CredentialException e) {
addFieldError("userUsername", e.getMessage());
addActionError(e.getMessage());
return INPUT;
}
if (user != null) {
session.put("user", user);
return SUCCESS;
}
return ERROR;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,如果用户名或密码无效,我会抛出一个CredentialException,然后在我的fieldError中填充该例外消息.我甚至尝试添加动作错误.
通过一些建议和在线搜索,我设法使用分别存储和提取的RegisteredUserAction.action和MainAction.action中的注释使用Message Store Interceptor.
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = "store", params = {"operationMode", "STORE"}),
@InterceptorRef("defaultStack"),})
Run Code Online (Sandbox Code Playgroud)
和
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
@InterceptorRef(value = …
Run Code Online (Sandbox Code Playgroud) 我们在IIS7.5之后使用Tomcat 6.29,使用spring,hibernate和struts2框架.我们现在开始注意到服务器会话正在混乱,特别是在Ajax请求中.
关于这个问题的更多细节
任何指向问题根源的指针都会有所帮助,代码运行正常,用户数量较少,并且没有报告此类实例.
编辑
web.xml中
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>bm</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*Context.xml</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
在struts.xml
<result-types>
<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<interceptors>
<interceptor name="sessionLoggin" class="com.inrev.bm.interceptor.IRLoggingInterceptor" />
<interceptor name="appAccess" class="appAccessInterceptor" />
<interceptor-stack name="newStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref …
Run Code Online (Sandbox Code Playgroud) 我有一个动作类,它有两个动作方法。我想要单独的验证方法。我是Struts2的新手。我想要这样的东西。我认为可以通过验证拦截器实现,但是如何呢?
public class ApplicantRegistration extends ActionSupport{
public String method1(){
// validate1
}
public String method2(){
// validate2
}
@override
public void validate1(){
// validations
}
public void validate2(){
//validations
}
}
Run Code Online (Sandbox Code Playgroud) 这就是我需要的东西,我不仅需要使用我的.war来提供java,还需要一些javascript文件.所以,例如.如果有人去了网址:
example.com/js/foo.jar
Run Code Online (Sandbox Code Playgroud)
然后我需要将其正确地作为javascript文件提供.同时,如果有人去:
example.com/bar
Run Code Online (Sandbox Code Playgroud)
我需要将Struts2作为可能的控制器来提供服务.
我在网上发现的从url中删除后缀的方法会导致两个URl都被struts 2服务(因此foo.js
即使它存在,也会给第一个文件带来错误).是否有一种方法(例如拦截器)在发出错误之前首先检查给定的.js文件是否存在?
我正在使用spring,spring security,hibernate和Oauth构建基于云的应用程序.
每个客户端都可以拥有多个用户,客户端必须提供访问其用户产品的权限.
订阅每个产品时,客户必须选择包(银,金,..)
包将具有模块详细信息,并且每个产品都不允许用户,并且客户端用户将只能访问客户订阅和用户有权访问的模块(选定包).
我必须为每个功能创建Rest Api.
问题:我使用Spring Oauth2来保护我的API,所以只有注册的客户端和他们的用户可以访问它们,但他们可以访问所有的API.我应该允许客户端只访问它有权访问/订阅的那些API.我怎样才能在Spring中实现这一目标?
目前我打算使用感知器,但它在很大程度上取决于URL模式.因此,对于每个产品和模块,我将使用不同的拦截器
网址格式:http:// abc/rest/PRODUCT/MODULE/..
有没有更好的方法来实现它?
spring design-patterns spring-mvc subscriptions struts2-interceptors
我的拦截器(验证)没有在动作之前或之后被调用.任何想法如何让它工作?
注意:每次调用默认拦截器时.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default,json-default">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
<result-type name="json" class="org.apache.struts2.json.JSONResult" />
</result-types>
<interceptors>
<interceptor name="validation" class="ValidatorBaseAction"/>
<interceptor-stack name="default">
<interceptor-ref name="logger"/>
</interceptor-stack>
<interceptor-stack name="validationStack">
<interceptor-ref name="validation"/>
<interceptor-ref name="default"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="default" />
<action
name="viewRequest"
class="ViewAction"
method="execute">
<interceptor-ref name="validationStack" />
<result name="input" type="redirectAction">explore</result>
<result name="success" type="redirect">/showRequest.do?${explorerParameters}</result>
</action>
</package>
</struts>
Run Code Online (Sandbox Code Playgroud) java struts2 interceptor interceptorstack struts2-interceptors
我想知道如何将转换String
到Date
在Struts2.我有一个简单的表单,用户以此格式提供日期"yyyy-MM-dd"
.将Sturts2地图表格提交给bean.我在日期转换中遇到错误.我谷歌它很多,并声明我们必须使用自定义类型转换器.我不想为日期转换编写自定义类型转换器.我认为Struts2中应该有一个简单的机制来进行数据转换,因为数据转换是非常常见的功能.
JSP
<s:form action="AddDomain">
<s:push value="idp">
<s:textfield name="domainName" label="Domain Name" />
<s:textfield name="url" label="Domain URL" />
<s:textfield name="noOfLicense" label="License Purchased" />
<s:textfield name="licenseExpireDate" label="License Expire Date"
title="YYYY-MM-DD like 2013-01-21" />
<s:textfield name="userActiveDuration" label="Active User Duration"
title="please mention in days" />
<s:textarea name="notes" label="Note" cols="30" rows="5" ></s:textarea>
<s:submit value="Add" />
</s:push>
</s:form>
Run Code Online (Sandbox Code Playgroud)
这是用户输入输入的JSP.
模型类
@Entity
@Table(name = "Domain")
public class IdentityProvider implements Serializable {
@Id
@Basic(optional = false)
private String url;
private String domainName;
private …
Run Code Online (Sandbox Code Playgroud) 我正在研究 struts2 Web 应用程序,我正在使用令牌拦截器处理 CSRF 漏洞。
我所做的是成功和错误,我会将用户重定向到同一页面,但会出现操作错误或成功消息。
<action name="saveApplicationForm" class="action.ApplicationFormAction"
method="saveApplicationForm">
<interceptor-ref name="token" />
<result name="invalid.token" type="tiles">applicationForm.tiles</result>
<result name="input" type="tiles">applicationForm.tiles</result>
</action>
Run Code Online (Sandbox Code Playgroud)
没有令牌/令牌会话拦截器一切正常,但是当我使用拦截器时,我收到了 NullPointerException。
堆栈跟踪
java.lang.NullPointerException: null
at action.ApplicationFormAction.saveApplicationForm(ApplicationFormAction.java:218) ~[ApplicationFormAction.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_67]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252) [xwork-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.handleValidToken(TokenInterceptor.java:193) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.handleToken(TokenInterceptor.java:154) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.interceptor.TokenInterceptor.doIntercept(TokenInterceptor.java:142) [struts2-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) [xwork-core-2.3.16.3.jar:2.3.16.3]
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) [xwork-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) [struts2-core-2.3.16.3.jar:2.3.16.3]
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) [struts2-core-2.3.16.3.jar:2.3.16.3] …
Run Code Online (Sandbox Code Playgroud) java struts2 csrf-protection interceptorstack struts2-interceptors
struts2 ×11
java ×7
interceptor ×3
jsp ×2
csrf ×1
date ×1
java-ee ×1
model-driven ×1
security ×1
spring ×1
spring-mvc ×1
url-routing ×1
validation ×1
xss ×1