标签: struts2-interceptors

没有mutators和访问器(setter/getters)的参数以及Struts 2中的参数拦截器

在下面的动作类中,我使用的是参数拦截器.

@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)

jsp struts2 interceptor struts2-interceptors

7
推荐指数
1
解决办法
945
查看次数

Struts 2 拦截器中的会话

我试图通过实现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),所以如果用户没有登录,它不会让他进入网站,如果他登录了,至少他的用户名应该在会话中。难道不应该吗?

struts2 struts2-interceptors

5
推荐指数
1
解决办法
1万
查看次数

意外异常在'类xxx上设置了'xxx':错误设置表达式'xxx',其值为['x',]

我将一些参数传递给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

5
推荐指数
1
解决办法
2万
查看次数

如何在Struts2上实现CSR防伪代码?

我在我的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)

security xss struts2 csrf struts2-interceptors

5
推荐指数
1
解决办法
4874
查看次数

使用Message Store Interceptor进行Struts 2验证

我有一个动作,我试图登录用户.

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)

jsp struts2 java-ee struts-validation struts2-interceptors

4
推荐指数
1
解决办法
3781
查看次数

用户会话在tomcat上混淆了

我们在IIS7.5之后使用Tomcat 6.29,使用spring,hibernate和struts2框架.我们现在开始注意到服务器会话正在混乱,特别是在Ajax请求中.

关于这个问题的更多细节

  • 用户1请求page1,用户2请求page2.但是user1获得了page2,而user2获得了server1.
  • 会话ID也在变化,但在刷新页面时,会提供正确的页面.
  • 当用户数量很多时,问题似乎更频繁地发生.

任何指向问题根源的指针都会有所帮助,代码运行正常,用户数量较少,并且没有报告此类实例.

编辑

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)

java struts2 thread-safety interceptor struts2-interceptors

4
推荐指数
1
解决办法
4211
查看次数

如何在Struts 2的一个动作类中使用不同的验证方法

我有一个动作类,它有两个动作方法。我想要单独的验证方法。我是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)

java validation struts2 struts2-interceptors

4
推荐指数
1
解决办法
1024
查看次数

如何在Struts 2中使用没有后缀的URL(例如.action)?

这就是我需要的东西,我不仅需要使用我的.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文件是否存在?

java struts2 url-routing struts2-interceptors

3
推荐指数
1
解决办法
4264
查看次数

订阅设计模式:春天

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

3
推荐指数
1
解决办法
395
查看次数

拦截器没有在Struts中被调用

我的拦截器(验证)没有在动作之前或之后被调用.任何想法如何让它工作?

注意:每次调用默认拦截器时.

<?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

2
推荐指数
1
解决办法
1149
查看次数

Struts2中的日期转换

我想知道如何将转换StringDate在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)

java struts2 date type-conversion struts2-interceptors

1
推荐指数
1
解决办法
4311
查看次数

令牌/令牌会话拦截器导致 HttpSession 上的空指针

我正在研究 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

1
推荐指数
1
解决办法
921
查看次数