我想实现一个功能,就是在页面每次发起请求的时候,我通过过滤器来获取这个action的name或者method。 <action name="queryh" class="cn.com.norm.web.action.QueryAction" method="queryByHttp">
<result type="json" />
</action>如果我在具体执行的方法中加入下面代码,是可以正确获取到这个属性的。
String getName = ServletActionContext.getActionMapping().getName();
System.out.println("-----getName----->>"+getName);
输出的就是上面配置文件中name的值:“ queryhp ” 。
但是我把上面这个代码写到过滤器中,就不行了,会报错。
package cn.com.faqm.tool;import java.io.IOException;import javax.servlet.*;import org.apache.struts2.ServletActionContext;public class OpFilter implements Filter { protected FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException {
if(servletRequest.getParameter("actId") != null && !servletRequest.getParameter("actId").equals("")){
String getName = ServletActionContext.getActionMapping().getName();
System.out.println("-----getName----->>"+getName);
}
filterchain.doFilter(servletRequest, servletResponse);
} public void destroy() {
this.filterConfig = null;
}
}
错误信息如下:
2012-12-12 15:00:19 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
at org.apache.struts2.ServletActionContext.getActionMapping(ServletActionContext.java:85)
at cn.com.faqm.tool.OpFilter.doFilter(OpFilter.java:19)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
这个问题在网上找了下,有类似问题,说是servlet或jsp中,重复调用response的 getOutputStream(),response.getWriter()方法。
请教一下,如果是上面这种说法导致的问题,应该怎么避免?
或者有没有别的方法可以在每次发起请求的时候都把action的name或者method获取到?
<result type="json" />
</action>如果我在具体执行的方法中加入下面代码,是可以正确获取到这个属性的。
String getName = ServletActionContext.getActionMapping().getName();
System.out.println("-----getName----->>"+getName);
输出的就是上面配置文件中name的值:“ queryhp ” 。
但是我把上面这个代码写到过滤器中,就不行了,会报错。
package cn.com.faqm.tool;import java.io.IOException;import javax.servlet.*;import org.apache.struts2.ServletActionContext;public class OpFilter implements Filter { protected FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException {
if(servletRequest.getParameter("actId") != null && !servletRequest.getParameter("actId").equals("")){
String getName = ServletActionContext.getActionMapping().getName();
System.out.println("-----getName----->>"+getName);
}
filterchain.doFilter(servletRequest, servletResponse);
} public void destroy() {
this.filterConfig = null;
}
}
错误信息如下:
2012-12-12 15:00:19 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
at org.apache.struts2.ServletActionContext.getActionMapping(ServletActionContext.java:85)
at cn.com.faqm.tool.OpFilter.doFilter(OpFilter.java:19)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
这个问题在网上找了下,有类似问题,说是servlet或jsp中,重复调用response的 getOutputStream(),response.getWriter()方法。
请教一下,如果是上面这种说法导致的问题,应该怎么避免?
或者有没有别的方法可以在每次发起请求的时候都把action的name或者method获取到?
如果楼主把method去掉路径换成 将methodName写到url里面就可以很轻松获得了,如4楼代码!
public class OpFilter extends HttpServlet implements Filter
1.userId我只能在登录的时候获得一次,后面就获取不到了,这是为什么?
2.我现在是在用户登录,第一次获取到userId的时候,用map来保存sessionId和userId,然后每次操作我就通过sessionId去map里面找userId,map可以保存多少条记录?我想在session失效的时候从map里面把对应的记录删除掉,请问应该怎么处理?package cn.com.faqm.tool;import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;public class OpFilter implements Filter { protected Map<String, String> userSessionIdMap = new HashMap<String, String>(); public void init(FilterConfig filterConfig) throws ServletException {
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpRequest.getSession();
//actId为空时不进行处理
if (servletRequest.getParameter("actId") != null && !servletRequest.getParameter("actId").equals("")) {
String reqPath = httpRequest.getServletPath();
//获取所有请求路径,只对".html"结尾的请求进行处理
if(reqPath.endsWith(".html")){
String userId = httpRequest.getParameter("userId");
String sessionId = session.getId();
//获取所有页面上传入的属性
Enumeration en = servletRequest.getParameterNames();
StringBuffer params = new StringBuffer();
String paramName = "";
String paramValue = "";
while(en.hasMoreElements()){ //遍历所有属性,对有值的进行组装
paramName = en.nextElement().toString();
paramValue = servletRequest.getParameter(paramName);
if(!paramName.equals("start")&&!paramName.equals("persize")){ //排除用于分页的两个属性
if(paramValue!=null&&!paramValue.equals("")){
params.append("参数").append(paramName).append("->").append(paramValue).append(" - ");
}
}
}
if(userId!=null&&!userId.equals("")){ //登录时才能获取到userId
userSessionIdMap.put(sessionId, userId); //保存对应的sessionId和userId
// SysLogger.log(userId, "用户"+userId+"登录系统", params.toString().substring(0, params.toString().length()-3), sessionId);
}else{
//登录以后获取不到userId,通过sessionId从userSessionIdMap中获取userId
if(userSessionIdMap.get(sessionId)!=null && !userSessionIdMap.get(sessionId).equals("")){
// SysLogger.log(userSessionIdMap.get(sessionId), "发起请求->"+reqPath, params.toString().substring(0, params.toString().length()-3), sessionId);
}
}
}
}
filterchain.doFilter(servletRequest, servletResponse);
} public void destroy() {
}
}
request.getSession().setAttribute("userId", userId);