0 0

Filter中ServletContext获取FilterConfig-getServletContext()空指针异常5

一直没弄懂是什么原因,用的是S2SH架构,做一个自动登录的filter,想要记录客户端的信息,可就是报空指针异常,先上代码:
引用

package com.tyyf.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import com.tyyf.biz.UserBiz;
import com.tyyf.hibernate3.User;
import com.tyyf.tool.ClientIp;
import com.tyyf.tool.GetDate;

/**
*功能:首先检测session中是否有user, 如果没有再检测cookie中是否有对应的邮箱和密码,
* 如果有那么就查出该user放进session中,如果都没有那么就doFilter()
*/
public class CookieLoginFilter extends HttpServlet implements Filter,
ServletContextAware, ServletRequestAware, ServletResponseAware {
/**
* 实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。
* 如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错 。
*/
private static final long serialVersionUID = 1L;
private javax.servlet.http.HttpServletRequest request;
private javax.servlet.http.HttpServletResponse response;

// struts2的request和response都需要重写接口,否则都获取不到值
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}

@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}

private FilterConfig config; // 后面主要用来记录登录日志

// 实现初始化方法
public void init(FilterConfig config) throws ServletException {
this.config = config;
}

// 实现销毁方法
public void destroy() {
this.config = null;
}


// 使用UserBiz接口声明了一个对象
// 并为其添加set方法,用于依赖注入
UserBiz userBiz;

public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}

GetDate getDate;

public void setGetDate(GetDate getDate) {
this.getDate = getDate;
}

ClientIp clientIp;

public void setClientIp(ClientIp clientIp) {
this.clientIp = clientIp;
}

ServletContext context;

@Override
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
this.context = context;
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
// 获取ServletContext对象,用于记录日志
context = config.getServletContext();
long before = System.currentTimeMillis();
System.out.println("开始过滤... ");
// 将请求转换成HttpServletRequest请求
request = (HttpServletRequest) req;
// 记录日志
context.log("Filter已经截获到用户的请求的地址: " + request.getServletPath());
// 获取客户IP
String ip = clientIp.getIpAddr(request);
Object objectemail = request.getSession().getAttribute("email");
Object objecttelephone = request.getSession().getAttribute("telephone");
String email = null;
String telephone = null;
String password = null;
String autostatus = null;
User user = new User();
if (objectemail != null || objecttelephone != null) { // 如果session中有用户信息,则直接验证
user.setEmail((String) objectemail);
user.setTelephone((String) objecttelephone);
user = userBiz.getUser(user);
if (user.getEmailcheck() == 1) {
request.setAttribute("nickname", user.getNickname());
// 根据level判定grade显示等级,便于显示于网页
String grade = null;
if (user != null) {
grade = "普通会员";
} else if (user.getLevel() == 2) {
grade = "白银会员";
} else if (user.getLevel() == 3) {
grade = "黄金会员";
} else if (user.getLevel() == 4) {
grade = "白金会员";
} else if (user.getLevel() == 5) {
grade = "翡翠会员";
}
request.setAttribute("level", user.getLevel());
request.setAttribute("grade", grade);
request
.setAttribute("beforelastdate", user
.getBeforelastdate());
}
} else if (objectemail == null && objecttelephone == null) {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (int i = 0; i < cookies.length; i++) {
// 判断cookie邮箱名是否匹配
if (cookies[i].getName().equalsIgnoreCase("cemail")) {
email = cookies[i].getValue().trim(); // trim()方法,去除字符串首尾空格
} else if (cookies[i].getName().equalsIgnoreCase(
"ctelephone")) { // 判断cookie手机名是否匹配
telephone = cookies[i].getValue().trim();
} else if (cookies[i].getName().equalsIgnoreCase(
"cpassword")) { // 判断密码名是否匹配
password = cookies[i].getValue().trim();
} else if (cookies[i].getName().equalsIgnoreCase(
"cautostatus")) { // 获取自动登录信息
autostatus = cookies[i].getValue().trim();
}
}
if (email != null || telephone != null && autostatus == "1") {
user.setEmail(email);
user.setTelephone(telephone);
user = userBiz.getUser(user);
if (user.getPassword().equals(password)
&& user.getLocked() != 1) {
request.setAttribute("nickname", user.getNickname());
// 根据level判定grade显示等级,便于显示于网页
String grade = null;
if (user.getLevel() == 1) {
grade = "普通会员";
} else if (user.getLevel() == 2) {
grade = "白银会员";
} else if (user.getLevel() == 3) {
grade = "黄金会员";
} else if (user.getLevel() == 4) {
grade = "白金会员";
} else if (user.getLevel() == 5) {
grade = "翡翠会员";
}
request.setAttribute("level", user.getLevel());
request.setAttribute("grade", grade);
request.setAttribute("beforelastdate", user
.getBeforelastdate());
// 更新用户登录信息
user.setUserip(ip);
user.setBeforelastdate(user.getLastlogindate());
user.setLastlogindate(getDate.getDateTime());
userBiz.updateUsers(user);
}
}
}
}
chain.doFilter(request, response);
long after = System.currentTimeMillis();
// 记录日志
context.log("过滤结束");
// 再次记录日志
context.log("请求被定位到" + request.getRequestURI() + "所花的时间为: "
+ (after - before));
}

}

然后是错误信息:
引用

java.lang.NullPointerException
at com.tyyf.filter.CookieLoginFilter.doFilter(CookieLoginFilter.java:98)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)


web.xml配置片段
引用

<filter>
<filter-name>CookieLoginFilter</filter-name>
<!-- 必须加载spring驱动才能正确注入过滤器 -->
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<description>This is useing in the spring</description>
<param-name>CookieLoginFilter</param-name>
<param-value>CookieLoginFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CookieLoginFilter</filter-name>
<url-pattern>/marriagepage/*</url-pattern>
</filter-mapping>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>CookieLoginFilter</servlet-name>
<servlet-class>com.tyyf.filter.CookieLoginFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieLoginFilter</servlet-name>
<url-pattern>/servlet/CookieLoginFilter</url-pattern>
</servlet-mapping>
2014年4月03日 11:17
目前还没有答案

相关推荐

    JavaWeb开发技术-FilterConfig接口.pptx

    JavaWeb开发技术中,FilterConfig接口扮演着至关重要的角色,它是Servlet API的一部分,主要用于帮助Filter程序获取在web.xml配置文件中的相关信息。理解并熟练运用FilterConfig接口是进行JavaWeb开发的基础,下面...

    WEB 项目中JAVA取得WEBROOT物理路径

    在Filter中,我们可以直接从`FilterConfig`获取。在监听器中,`ServletContextListener`的`contextInitialized()`方法会传递`ServletContextEvent`,其中包含`ServletContext`。 - 获取WEBROOT路径: ```java ...

    带filter的留言板 参数读写

    在`Filter`的`init`方法中,可以获取`ServletContext`,然后在其中存储或读取数据: ```java public void init(FilterConfig filterConfig) throws ServletException { ServletContext context = filterConfig....

    Filter学习心得

    // 在Filter类中,可以通过如下方式获取FilterConfig实例 public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } ``` **获取配置信息示例:** ```java // 获取...

    STRUTS:filter过滤器

    ServletContext context = getFilterConfig().getServletContext(); long before = System.currentTimeMillis(); chain.doFilter(req, res); long after = System.currentTimeMillis(); context.log("Request ...

    读取webroot文件下的属性文件

    在Servlet或Filter中,可以使用`getServletContext().getResourceAsStream()`方法: ```java ServletContext context = getServletContext(); // 在Servlet中 // 或者 FilterConfig config = getFilterConfig(); //...

    jsp中Filter类实现过滤器功能

    ServletContext context = config.getServletContext(); String realPath = context.getRealPath(filePath); // 获取实际路径 try { FileReader freader = new FileReader(realPath); // 通过文件路径获取文件 ...

    servlet2.4doc

    FilterConfig - interface javax.servlet.FilterConfig. A filter configuration object used by a servlet container to pass information to a filter during initialization. flushBuffer() - Method in ...

    jsp中servlet过滤器和侦听器

    - `getServletContext()`: 返回当前Web应用的ServletContext对象,用于获取应用级别的信息。 3. **FilterChain接口** - `doFilter(ServletRequest request, ServletResponse response)`: 执行过滤链中的下一个...

    Servlet、Filter、Listener深入理解.docx

    2. `getServletContext()`: 获取`ServletContext`对象,它是整个Web应用的共享环境,可以用来与其他Servlet共享信息。 3. `getInitParameter(String name)`: 根据名称获取初始化参数的值。 4. `...

    javaweb拦截器配置及原理.doc

    4. public ServletContext getServletContext():返回 Servlet 上下文对象的引用。 在编写配置 Filter 时,我们需要在 web.xml 中配置过滤器,包括添加过滤器的映射目录和注册过滤器。例如: ```xml &lt;filter&gt; ...

    JAVA实现权限管理的两种方式六编程资料

    context = filterConfig.getServletContext(); if (context == null) { logger.error("Unable to init as servlet context is null"); return; } loadConf(); logger.info("ManagerAuthFilter configured ...

    jsp中过滤器选择过滤器的写法详解.docx

    在`init()`方法中,我们通常会获取到`FilterConfig`对象,通过它我们可以获取到`ServletContext`,从而获取到项目的上下文路径(webroot),这对于构建URL非常有用。例如: ```java @Override public void init...

Global site tag (gtag.js) - Google Analytics