Struts2自定义异常处理拦截器出现问题

struts.xml:



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



<action name="insert" class="com.lul.action.InsertAction">
    <result name="success">success.jsp</result>
              <interceptor-ref name="exceptionInceptor"></interceptor-ref>
</action>

自定义异常类:
[code="java"]public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 1L;

public BusinessException(String errorMessage) {
    super(errorMessage);
}

}[/code]
自定义用于异常处理的拦截器:
public String intercept(ActionInvocation invocation) throws Exception {
String result = null;
try {
result = invocation.invoke();
} catch(DataAccessException dae) {
throw new BusinessException("数据库操作失败");
}
...
...捕获常见的异常,并以友好异常信息抛出
}
在调用insert.action后,dao抛出异常,但不知为什么不能跳到error.jsp页面,而是
[color=red]HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: com.lul.exception.BusinessException: Sorry, 数据库操作失败 Please try again!
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)[/color]

有哪位高手知道错误原因,请指教!

[b]问题补充:[/b]


error.jsp

    <global-exception-mappings>   
        <exception-mapping name="exceptionPage"  
                           exception="java.lang.Exception"  
                           result="exceptionPage"/>   
    </global-exception-mappings>  

这样是可以跳到error.jsp页面,但我想要的是在拦截器中对异常进行分类和包装,然后再以友好的方式提示到error.jsp
[b]问题补充:[/b]
to jones:
我是在exceptionInceptor拦截器里对异常进行分类,然后交给BusinessException去提示异常信息,不可能在Action里用N多的catch把异常分类吧,不知道有没有别的好的方法。
[b]问题补充:[/b]
to jones:
我明白你的意思,并且这样可以跳转到指定的错误页面,但我想请教一下,怎么能在错误页面获取拦截器里的异常提示信息。多谢!

12个回答

[code="java"]怎么能在错误页面获取拦截器里的异常提示信息。多谢! [/code]
这个简单,通过ActionContext.getContext().getValueStack()拿到OGNL的ValueStack,把你的异常信息存进去,然后再页面通过OGNL表达式获取就行了

你的程序正常执行并返回"error"字符串的时候才会到error.jsp,如果你想在抛出任何异常的时候都到error.jsp,只能通过web.xml中进行配置,如下:
[code="java"]
404
/error.jsp


500
/error.jsp
[/code]

貌似global-exception-mappings应该个name对应到global-results

[code="xml"]
error.jsp

    <global-exception-mappings>
        <exception-mapping name="error"
                           exception="com.lul.exception.BusinessException"
                           result="error"/>
    </global-exception-mappings>[/code]

顺便说一句,你上面的这种情况明显是你的拦截器有问题

改成这样试试吧

[code="java"]
public String intercept(ActionInvocation invocation) throws Exception {
String result = null;
try {
result = invocation.invoke();
} catch(DataAccessException dae) {
//throw new BusinessException("数据库操作失败");//这里就别抛出了
return "error";
}
[/code]

全局异常配置和你的那个异常拦截器ExceptionMappingInterceptor没有必然联系,正常情况下

[code="java"]

error.jsp

    <global-exception-mappings>
        <exception-mapping name="exceptionPage"
                           exception="java.lang.Exception"
                           result="exceptionPage"/>
    </global-exception-mappings>

[/code]

就会拦截java.lang.Exception异常,转到error.jsp页面

你的友好的异常不就只的是你包装成BusinessException 吗??
[code="java"]

error.jsp

        <global-exception-mappings>  
            <exception-mapping name="exceptionPage"  
                               exception="java.lang.BusinessException"  
                               result="exceptionPage"/>  
        </global-exception-mappings>  [/code]

这样应该就可以了吧

晕!
[code="java"]exception="com.lul.exception.BusinessException"[/code]

那你的拦截器大概是这样的:
[code="java"]
@Override
public String intercept(ActionInvocation invocation) throws Exception {
try {
return invocation.invoke();
} catch (Exception e) {
exception(e);
return Action.ERROR;
}
}

private void exception(Exception e) throws Exception {
    if (e instanceof BusinessException) {
        BusinessException be = (BusinessException) e;
        //处理
    }
    if (e instanceof OtherException) {
        OtherException be = (OtherException) e;
        //处理
    } else {
        throw e;
    }
}

[/code]

xml文件配置你是对的

好的处理方法应该是这样的,如果你想把异常消息显示给用户看,那就抛出你定义的BusinessException异常,然后异常拦截器就只处理BusinessException异常,把异常转换成友好的消息传给用户,这样异常拦截器大概可以写成这样:

[code="java"]
public class ExceptionMappingInterceptor extends StaticParametersInterceptor {

@Override
public String intercept(ActionInvocation invocation) throws Exception {
    try {
        return invocation.invoke();
    } catch (Exception e) {
        ActionSupport actionSupport = (ActionSupport) invocation.getAction();
        exception(e, actionSupport);
        return Action.ERROR;
    }
}

private void exception(Exception e, ActionSupport actionSupport) throws Exception {
    if (e instanceof BusinessException) {
        BusinessException be = (BusinessException) e;
        String who = actionSupport.getText(be.getWho());
        String errorType = actionSupport.getText(be.getErrorType(), new String[]{who, be.getValue()});
        actionSupport.addActionError(errorType);
    } else {
        throw e;
    }
}

}
[/code]

就可以在页面展示给用户看了。

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
struts2自定义拦截器怎么进不去

一个破拦截器搞了半天没发现哪里出问题了就是进不去自定义的拦截器里,下面贴代码: struts.xml <?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.1.dtd"> <struts> <package name="root" namespace="/" extends="struts-default"> <!-- 拦截器 --> <interceptors> <!-- 自定义拦截器 --> <interceptor name="myoneInterceptor" class="com.niit.action.MyoneInterceptor"/> <!-- 自定义拦截器栈 --> <interceptor-stack name="appstack"> <interceptor-ref name="myoneInterceptor"/> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <!--系统所用的拦截器栈名 --> <default-interceptor-ref name="appstack"/> <action name="MyAct" class="com.niit.action.Act"> <result name="input">MyJsp.jsp</result> </action> </package> </struts> java代码(在com.niit.action包里) Act类 package com.niit.action; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.RequestAware; import org.apache.struts2.interceptor.SessionAware; import org.apache.struts2.util.ServletContextAware; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class Act extends ActionSupport { public String login(){ return "input"; } } MyOneInterceptor类 package com.niit.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyOneInterceptor extends AbstractInterceptor{ public String intercept(ActionInvocation actionInvocation) throws Exception { // TODO Auto-generated method stub System.out.println("进入我的拦截器"); Object action = actionInvocation.getAction(); System.out.println("请求的对象名:" + action.getClass().getName()); return actionInvocation.invoke(); //让url继续执行 } } index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login3.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <s:form action="MyAct!login.action" method="get"> <input type="submit" value="提交"/> </s:form> </body> </html> MyJsp.jsp <%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'MyJsp1.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> myjsp </body> </html> web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

关于Struts自定义拦截器的问题

Struts自定义拦截器里只能设置不拦截指定的方法或者只拦截指定的方法。如果我有两个Action(Action1,Action2)而里面的方法有相同方法名的方法(foo()),而我想拦截Action1的foo()方法,不想拦截Action2的foo()方法,该怎么做呢,能不能指定拦截器不拦截指定的Action呢?*_*

Struts拦截器自定义方法不执行

写了个拦截器判断用户是否未登录访问,但是运行时,拦截器自定义方法没调用,请教各位大神我配置代码哪里有问题,为了方便您们看我代码我就直接截图贴上了(注:配置路径都是没问题的) Struts.xml![图片说明](https://img-ask.csdn.net/upload/201801/10/1515516487_274367.jpg) 拦截器自定义方法![图片说明](https://img-ask.csdn.net/upload/201801/10/1515516505_773940.jpg) 页面提交![图片说明](https://img-ask.csdn.net/upload/201801/10/1515516995_510437.jpg)

struts2中处理自定义异常的问题,求大神帮忙

先上代码: struts.xml ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 请求参数的编码方式 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 将struts2委托Spring管理 --> <constant name="struts.objectFactory" value="spring" /> <!-- 是否开启动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.devMode" value="true" /> <!-- 设置默认的父包,一般我们都设置一个default包继承自struts-default。大部分类再继承default。如果有特殊的类需要特殊的包,只能在action中再指定父包了。 --> <constant name="struts.convention.default.parent.package" value="default" /> <!-- 默认配置包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。通过设置struts.convention.package.locators属性来修改这个配置。 --> <constant name="struts.convention.package.locators" value="action,actions,controller,web" /> <!-- 约定Action类名:要求Action的命名必须以Action为后缀,可以使用下面常量来修改后缀限制 --> <constant name="struts.convention.action.suffix" value="Action" /> <package name="default" extends="struts-default"> <global-results> <!-- <result name="error1">/commons/error1.jsp</result> --> <result name="error2">/commons/error2.jsp</result> <result name="login">/login/login.jsp</result> </global-results> <global-exception-mappings> <!-- <exception-mapping result="error1" exception="java.lang.Exception"/> --> **<exception-mapping result="error2" exception="com.lz.shop.web.action.MyException" />** <exception-mapping result="sqlException" exception="java.sql.SQLException" /> </global-exception-mappings> </package> </struts> ``` <exception-mapping result="error2" exception="com.lz.shop.web.action.MyException" /> 这一句为什么会无效呀?试了很多办法都不行 求大神解答! 自定义异常类: MyException.java ``` package com.lz.shop.web.action; public class MyException extends Exception { /** * */ private static final long serialVersionUID = -4567535714727601736L; public MyException() { super(); } private String message="bmddddd"; public MyException(String message) { this.message = message; } public String getMessage() { return message; } } ``` error2.jsp ``` <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>ERROR1</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <span>ERROR2</span> <s:fielderror></s:fielderror> <s:property value="exception.message" /> </body> </html> ``` Action测试类: LoginAction.java ``` package com.lz.shop.web.action; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.lz.shop.entity.base.User; import com.lz.shop.web.BaseSupport; @Scope @Controller @Namespace("/user") @ParentPackage("default") public class LoginAction extends BaseSupport { /** * */ private static final long serialVersionUID = 6336185736252504861L; private User user; /** * 验证登陆 * * @return */ @Action(value = "loginAction", results = { @Result(name = "success", location = "/index.jsp", type = "redirect"), @Result(name = "input", location = "/login/login.jsp") }) public String login() { //抛个空指针异常来测试 if (user.getUsername() == "1" && user.getPassword() == "1") { System.out.println("success"); return "success"; } else { System.out.println("input"); return "input"; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } ``` struts2版本是2.2.1 求大神支招!!!

Struts2 默认拦截器 不能拦截所有action

默认拦截器配置节选: <package name="all" extends="struts-default" namespace="/"> <interceptors> <interceptor name="myinterceptor" class="Action.Util.InterceptorAction" /> <interceptor-stack name="myIntcepStack"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="myinterceptor" /> </interceptor-stack> </interceptors> <!-- 声明包的默认截拦器栈 --> <default-interceptor-ref name="myIntcepStack" /> …… action配置: <!-- 通用Action配置 --> <package name="util" extends="all"> <action name="Login" class="Action.USER.LoginAction" method="login"></action> <action name="GetSessionInfo" class="Action.Util.GetSessionInfoAction" method="GetSessionInfo"></action> <action name="ShowPhoto" class="Action.Util.ImageAction" method="GetImagebyId"></action> <!-- 行政区划补全接口 --> <action name="RegionAutoComp" class="Action.Util.GetRegionInfoAction" method="AutoComplete"></action> <action name="GetGrassBType" class="Action.Util.GetGrassType" method="GetGrass_B_Type"></action> …… 各类具体的实现方法流程都大致相同 结果调用Login.action没有进入拦截器代码,而调用GetSessionInfo则能进入拦截器代码,而且进入拦截器的顺序也不一样,有的在执行完action后直接拦截器,有的首先执行拦截器再执行Action,这可能是什么原因导致的?

Struts2项目中配置的自定义过滤器无效

Struts2的核心过滤器不用多说,配置如下 [code="java"] <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> [/code] 此外,还配置了一个自定义的过滤器,<url-pattern>*.html</url-pattern> (我的Struts2请求后缀是html) 结果没有进入这个过滤器,把*.html改成/*就行了,但是这个过滤器只负责拦截html,如果写/*的话所有都会拦截,比如js, css等,这样就不符合本意了,请指点。 拦截器就不用说了,我暂时不考虑用拦截器,不想因为是Struts2就放弃了原先的过滤器。 请都先看清楚了再回答,没素质的疯子远离,谢谢

怎样在struts2 自定义拦截器中获取正在执行的action的方法名

最近在做权限管理,需要细化到方法的操作上去,但是在拦截器中不知道怎么获取action的方法名,虽然用InvocationHandler,使用动态代理可以实现,但是太麻烦,需要将所有的action进行动态代理.有没有比较好的解决方法 ....

spring.xml中配置struts2的注解方式拦截器

我现在的配置文件就一个(spring.xml),想用注解方式实现struts2的拦截器功能。想不增加struts2的配置文件,只在spring.xml中添加配置,应该怎么写

为什么我的struts2拦截器不起作用

我在网上学了点拦截器,自己试验了一下,发现程序运行没有问题,但是拦截器貌似没有生效<br> 网上说这么应该会输出几行文字<br> Pre-Processing<br> Inside action....<br> Post-Processing<br> 但是我这只输出了一行文字<br> Inside action....<br> 网上web.xml中 ``` <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` filter-class中的内容不同,我改为网上的内容后,就会报错,<br> One or more Filters failed to start. Full details will be found in the appropriate container log file ``` 现在,在给定的文本框中输入任何单词,然后单击“Say Hello按钮执行已定义的动作。现在,如果你将检查生成的日志,你会发现下面的文字在底部:<br> ``` ``` Pre-Processing<br> Inside action....<br> Post-Processing<br> ``` ``` struts.xml文件配置 <package name="helloworld" extends="struts-default"> <interceptors> <interceptor name="Login" class="struts2.src.com.struts2.Interceptor.LoginInterceptor" > </interceptor> </interceptors> <action name="Hello" class="com.struts2.demo.HelloAction"> <interceptor-ref name="params"/> <interceptor-ref name="Login" /> <result name="success">HelloWorld.jsp</result> </action> </package> ``` ``` 拦截器 package com.struts2.Interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; @SuppressWarnings("serial") public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation)throws Exception{ /* let us do some per-processing */ String output = "Pre-Processing"; System.out.println(output); /* let us call action or next intercepter */ String result = invocation.invoke(); /* let us do some post-processing */ output = "Post-Processing"; System.out.println(output); return result; } } ``` ``` web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="starter" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Struts 2 Rest Example</display-name> <!-- Filters --> <!-- START SNIPPET: filter --> <filter> <filter-name>action2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- END SNIPPET: filter --> <filter-mapping> <filter-name>action2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Welcome file lists --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> ```

struts2拦截器页面跳转问题

我用html页面作为主页跳转页面, <body> <script type="text/javascript"> location.href='page_common_index.action'; </script> </body> 自定义一个拦截器,验证session中有没有user,如果有,放行,没有跳转登录页面 Object object = ServletActionContext.getRequest().getSession().getAttribute("user"); if(object == null){ return "login"; } return invocation.invoke(); 问题是我登录成功一次,然后清除session,直接访问主页,发现拦截器不起作用,直接能跳转到主页面,这是怎么回事?如果没有登录过,跳转页面没有问题,登录一次,清除session,跳转失效,清除浏览器缓存再试就可以拦截到,这是怎么回事

Struts2拦截器问题

我现在的项目中没有在struts.xml中配置任何的拦截器,是否会自动隐藏一个默认的拦截器呢?现在项目前台是用的Ext,设计到上传图片,加了属性fileUpload:true,每个属性的name都是bena.XXX,可是每次到后台都报bean为空,出现空指针异常。是不是因为我没有在struts.xml中配置拦截器呢?可是第一次会出现空指针,刷新后,重新再保存就没有空指针了。很是奇怪,希望能有人帮忙解答一下。

struts2中,如何关闭某个拦截器

struts2中,如何关闭某个拦截器,我想用自己的文件上传方案,但是老是被struts2拦截,结果我得到的文件list=0, 结果发现struts-default中有个默认的fileUpload,拦截器,怎么禁用它。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="com.main" namespace="/" extends="struts-default"> <action name="test*" class="com.main.Test" method="{1}"> </action> </package> </struts>

Struts2 过滤器和拦截器执行的顺序

在web.xml ,定义首页位置: [code="xml"] <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> [/code] 并配置了一个filter,用于过滤对jsp的直接访问. [code="xml"] <filter> <filter-name>indexfilter</filter-name> <filter-class>com.prodinfo.filter.IndexFilter</filter-class> </filter> <filter-mapping> <filter-name>indexfilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping> [/code] [code="java"] ...... public class IndexFilter implements Filter { ...... public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest re = (HttpServletRequest) request; HttpSession session = re.getSession(); //redirect to action request.getRequestDispatcher("loadindex.action?id=xxx").forward( request, response); System.out.println("i am filter"); } ...... } [/code] struts.xml中配置了interceptor,拦截用户的请求,在action执行之前,load页面信息,然后继续. [code="xml"] <interceptors> <interceptor name="LoadHeaderFooter" class="loadHeaderFooter"> </interceptor> <interceptor-stack name="InterceptorStack"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="LoadHeaderFooter" /> </interceptor-stack> </interceptors> <action name="loadindex" class="companyInfoAction" method="loadCompanyInfo"> <result name="success">/index.jsp</result> <interceptor-ref name="LoadHeaderFooter"></interceptor-ref> </action> [/code] [code="java"] ...... public String intercept(ActionInvocation invocation) throws Exception { //System.out.println("Before Action"); //get header & footer infomation List result = ci.getHeaderFooter("xxx"); ...... System.out.println("i am interceptor"); final String res = invocation.invoke(); //System.out.println("After Action"); return res; } ...... [/code] 我理解的执行顺序是(<welcome-file-list>)index.jsp->(filter)"loadindex.action?id=xxx"->(interceptor)"loadHeaderFooter"->(Action)"loadindex"->(jsp)index.jsp 可是现在执行的顺序是先interceptor再filter,程序运行打印结果是: i am interceptor loading company info of null i am filter 请问我该在哪里配置filter 和 interceptor的顺序呢? 谢谢! [b]问题补充:[/b] 谢谢 蔡华江 的回复. 即是说我应该从web.xml里filter的位置来下手找我的问题的原因? [b]问题补充:[/b] 去掉了interceptor,发现还是先执行的action再进的filter. Struts2的执行顺序一定是先action再filter? 已经把FilterDispatcher放到web.xml最上面了.

struts 2 异常处理问题

在struts 2, 当action抛exception,如何扑捉异常信息将其写入指定error log文件。希望给出相关代码。谢谢 [b]问题补充:[/b] 我想要的效果是:在action中不catch任何exceptoin: [code="java"] public String execute() throws Exception { return Action.SUCCESS; }[/code] 在struts.xml中将exception导航到exception.jsp: [code="java"] <global-results> <result name="exception">/exception.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="exception"/> </global-exception-mappings>[/code] 但是,在这种情况下,exception没有写入error log文件。不知道有无一种简单、便利的方式一个action出了错误信息,直接执行相应代码写log,就像配置global-exception-mapping一样。这样就可避免每个action都去catch exception然后写log [b]问题补充:[/b] to lovewhzlq: [quote]做一个struts2的拦截器应该可以,对所有的异常进行记录到日志[/quote] 我也想到做一个拦截器,但怎么做呢?能否详细点?

怎么配置struts2拦截器除了/abc不拦截外拦截所有的

是在web.xml里面配置 filter-class org.apache.struts2.dispatcher.FilterDispatcher 如题,谢谢了

Struts2拦截器记录日志出现一些bug

自己在写一个小工程,想用拦截器实现记录日志的功能,就是没点一次操作记录一条日志,拦截器配好了,但是每次操作都会记录两条一样的数据,我Strut.xml是method跳method,(比 如先更改数据在遍历所有数据)如果改成method的跳jsp会记录一条更改数据操作,,但是感觉这样展现效果不是很好,用debug调试点一次方法拦截器走了两次,有没有好点的解决方法,在线等

Structs2自定义拦截器实现用户登录中用户名的校验问题

自定义拦截器实现登录前的校验,用户名为:NIIT密码为NIITNIIT则登录成功, 否则回到登录页面。 以下为自定义拦截器中的实现函数运行时会显示**_if行有问题_**。求大佬告知以下代码有什么问题。 ``` 拦截器.java @Override public String intercept(ActionInvocation actionInvocation) throws Exception { String username = (String) ActionContext.getContext().get("username"); String password = (String) ActionContext.getContext().get("password"); if(username.equals("NIIT")&&password.equals("NIITNIIT")) return actionInvocation.invoke(); else return "login"; } ``` ``` Action.java import com.opensymphony.xwork2.ActionSupport; public class Demo extends ActionSupport { String username; String password; public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } public String getUsername() { return username; } public String execute() { if(username.equals("NIIT")) return SUCCESS; else { System.out.println(username+password); return ERROR; } } } ``` ``` Struts.xml <?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="Demo" extends="struts-default" > <interceptors> <interceptor name="CS17" class="CS17Intp" /> <interceptor-stack name="MyStack" > <interceptor-ref name="defaultStack"/> <interceptor-ref name="CS17"/> </interceptor-stack> </interceptors> <action name="CS17" class="Demo" method="execute" > <result name="success">Hello.jsp</result> <result name="error">Error.jsp</result> <result name="login">index.jsp</result> <interceptor-ref name="MyStack"/> </action> </package> </struts> ``` ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574310956_185851.png) ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574310966_198080.png)

Struts2拦截器Struts2拦截器Struts2拦截器Struts2拦截器

请问谁有Struts2拦截器学习的详细资料,请问谁有Struts2拦截器学习的详细资料,感谢哈

有关struts2拦截器的问题

[color=indigo] [size=medium] 购买操作需要验证用户是否登录 ShopAction里面都是添加条目,修改条目之类的方法 我在struts.xml里给ShopAction配置了ShopInterceptor拦截器 [code="xml"] <interceptors>[color=indigo][/color] <interceptor name="shop" class="com.SandStorm.dang.interceptor.ShopInterceptor" /> </interceptors> <action name="shop_*" class="com.SandStorm.dang.action.ShopAction" method="{1}"> <result name="success">/WEB-INF/jsp/shopping/{1}.jsp</result> <result name="fail" type="redirectAction">logForm</result> <interceptor-ref name="shop" /> </action> <action name="cart_*" class="com.SandStorm.dang.action.ShopAction" method="{1}"> <result name="success" type="redirectAction">shop_cartShow</result> <result name="fail" type="redirectAction">logForm</result> <interceptor-ref name="shop" /> </action> [/code] 其中cart_*是添加,删除的操作,shop_*是用来显示购物车页面的 页面发送的请求是比如 cart_addItem.action?productId=1 这样的 请求经过了拦截器,那ShopAction是肯定拿不到 productId 这个参数了。 但是好像拦截器也拿不到,不仅如此,用拦截器做验证的时候, 我是先从session里面取userId,如果为空,那么再从cookie里面取 可是拦截器里好像取不到cookie 我的拦截器代码: [code="java"] public class ShopInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; private ActionContext ctx; private Map<String, Object> session; public String intercept(ActionInvocation invocation) throws Exception { String result = null; Boolean isLogin = null; ctx = invocation.getInvocationContext(); session = ctx.getSession(); ShopAction action = (ShopAction) invocation.getAction(); int id = action.getProductId(); action.setProductId(1); System.out.println("productId:" + id); if (session.containsKey(Constants.SESSION_ISLOGIN)) { isLogin = (Boolean) session.get(Constants.SESSION_ISLOGIN); } if (isLogin != null && isLogin) { result = invocation.invoke(); } else { result = Constants.FAIL; } return result; } } [/code] 请问类似这种问题该怎么解决? [/size][/color]

程序员的兼职技能课

获取讲师答疑方式: 在付费视频第一节(触摸命令_ALL)片头有二维码及加群流程介绍 限时福利 原价99元,今日仅需39元!购课添加小助手(微信号:csdn590)按提示还可领取价值800元的编程大礼包! 讲师介绍: 苏奕嘉&nbsp;前阿里UC项目工程师 脚本开发平台官方认证满级(六级)开发者。 我将如何教会你通过【定制脚本】赚到你人生的第一桶金? 零基础程序定制脚本开发课程,是完全针对零脚本开发经验的小白而设计,课程内容共分为3大阶段: ①前期将带你掌握Q开发语言和界面交互开发能力; ②中期通过实战来制作有具体需求的定制脚本; ③后期将解锁脚本的更高阶玩法,打通任督二脉; ④应用定制脚本合法赚取额外收入的完整经验分享,带你通过程序定制脚本开发这项副业,赚取到你的第一桶金!

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

lena全身原图(非256*256版本,而是全身原图)

lena全身原图(非256*256版本,而是全身原图) lena原图很有意思,我们通常所用的256*256图片是在lena原图上截取了头部部分的256*256正方形得到的. 原图是花花公子杂志上的一个

快速入门Android开发 视频 教程 android studio

这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

Java调用微信支付

Java 使用微信支付 一. 准备工作 1.

汽车租赁管理系统需求分析规格说明书

汽车租赁管理系统需求分析规格说明书,这只是一个模板,如果有不会的可以借鉴一下,还是蛮详细的。。。。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

程序员的算法通关课:知己知彼(第一季)

【超实用课程内容】 程序员对于算法一直又爱又恨!特别是在求职面试时,算法类问题绝对是不可逃避的提问点!本门课程作为算法面试系列的第一季,会从“知己知彼”的角度,聊聊关于算法面试的那些事~ 【哪些人适合学习这门课程?】 求职中的开发者,对于面试算法阶段缺少经验 想了解实际工作中算法相关知识 在职程序员,算法基础薄弱,急需充电 【超人气讲师】 孙秀洋&nbsp;| 服务器端工程师 硕士毕业于哈工大计算机科学与技术专业,ACM亚洲区赛铜奖获得者,先后在腾讯和百度从事一线技术研发,对算法和后端技术有深刻见解。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27272 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程无限观看时长,但是大家可以抓紧时间学习后一起讨论哦~

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

Python入门视频精讲

Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

Java62数据提取代码

利用苹果手机微信下面的wx.data文件提取出62数据,通过62可以实现不同设备直接登陆,可以通过文件流的方式用脚本上传到服务器进行解析

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

2018年全国大学生计算机技能应用大赛决赛 大题

2018年全国大学生计算机技能应用大赛决赛大题,程序填空和程序设计(侵删)

Lena图像处理测试专业用图,高清完整全身原图

Lena图像处理测试专业用图,高清完整全身原图,该图片很好的包含了平坦区域、阴影和纹理等细节,这些都有益于测试各种不同的图像处理算法。它是一幅很好的测试照片!其次,由于这是一个非常有魅力女人的照片。

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

verilog实现地铁系统售票

使用 verilog 实现地铁售票

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉系统全面的介绍。

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

获取Linux下Ftp目录树并逐步绑定到treeview

在linux下抓取目录树,双击后获取该节点子节点(逐步生成)。另外有两个类,一个是windows下的(一次性获取目录树),一个是linux下的(足部获取目录树)

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

手把手实现Java图书管理系统(附源码)

【超实用课程内容】 本课程演示的是一套基于Java的SSM框架实现的图书管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群。详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27513 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~ 【学员专享增值服务】 源码开放 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化

微信小程序开发实战之番茄时钟开发

微信小程序番茄时钟视频教程,本课程将带着各位学员开发一个小程序初级实战类项目,针对只看过官方文档而又无从下手的开发者来说,可以作为一个较好的练手项目,对于有小程序开发经验的开发者而言,可以更好加深对小程序各类组件和API 的理解,为更深层次高难度的项目做铺垫。

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

微信小程序 实例汇总 完整项目源代码

微信小程序 实例汇总 完整项目源代码

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯。 本系统控制六层电梯, 采用集选控制方式。 为了完成设定的控制任务, 主要根据电梯输入/输出点数确定PLC 的机型。 根据电梯控制的要求,

相关热词 c#对文件改写权限 c#中tostring c#支付宝回掉 c#转换成数字 c#判断除法是否有模 c# 横向chart c#控件选择多个 c#报表如何锁定表头 c#分级显示数据 c# 不区分大小写替换
立即提问
相关内容推荐