文本讲述在servlet+jsp+tomcat基础开发中
1.用filter解决字符编码问题(不需要再在每个Servlet的post方式中写上这样一行代码了request.setCharacterEncoding("utf-8");)
2.用filter解决session失效问题(解决当登陆之后,清除cookie,session依赖于cookie,再刷新页面出现500的问题,不再出现500,而是跳到登录界面)
首先在web.xml中配置filter
字符编码需要过滤到所有url,包括*.action和login
session失效需要过滤到*.action,不需要过滤login
我的servlet除了loginServlet的url是login,其余的均为*.action,解决session失效需要过滤到所有.action登录的时候一直重定向的问题。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>login</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.book.servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>DashboardServlet</servlet-name>
<servlet-class>com.book.servlet.DashboardServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>EditBookServlet</servlet-name>
<servlet-class>com.book.servlet.EditBookServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SaveBookServlet</servlet-name>
<servlet-class>com.book.servlet.SaveBookServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowMyBookServlet</servlet-name>
<servlet-class>com.book.servlet.ShowMyBookServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>BookPage</servlet-name>
<servlet-class>com.book.servlet.BookPageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>KindOfServlet</servlet-name>
<servlet-class>com.book.servlet.KindOfServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DashboardServlet</servlet-name>
<url-pattern>/dashboard.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>EditBookServlet</servlet-name>
<url-pattern>/editbook.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SaveBookServlet</servlet-name>
<url-pattern>/savebook.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowMyBookServlet</servlet-name>
<url-pattern>/showbook.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BookPage</servlet-name>
<url-pattern>/bookpage.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>KindOfServlet</servlet-name>
<url-pattern>/kindof.action</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.html</location>
</error-page>
<!--配置名称为Encoding的Filter -->
<filter>
<filter-name>Encoding</filter-name>
<filter-class>com.book.filter.PageEncodingFilter</filter-class>
<init-param>
<!-- 为encoding参数配置了utf-8 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 为名称为Encoding的Filter设置过滤所有url
所有的url都会被EncodingFilter过滤
-->
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/login</url-pattern>
</filter-mapping>
<!--配置 SessionFilter
不需要登录信息的页面
-->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.book.filter.SessionFilter</filter-class>
<init-param>
<param-name>notNeedLoginPages</param-name>
<param-value>,login.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<!-- 过滤所有url -->
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
PageEncodingFilter
package com.book.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
*
* PageEncodingFilter干的事情:
*
*
* @author y
*
*/
public class PageEncodingFilter implements Filter {
private String encoding="utf-8";
protected FilterConfig filterConfig;
//为一个请求过来配置一个utf-8的编码
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig=filterConfig;
if(filterConfig.getInitParameter("encoding") !=null) {
encoding = filterConfig.getInitParameter("encoding");
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
request.setCharacterEncoding("utf-8");
String uri = request.getRequestURI();
String requestUri = uri.substring(request.getContextPath().length()+1);
//System.out.println(uri+" = "+requestUri);
//请求继续往下走
filterChain.doFilter(request, servletResponse);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
SessionFilter
package com.book.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.book.entity.User;
public class SessionFilter implements Filter{
private String notNeedLoginPages;
protected FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig=filterConfig;
if(filterConfig.getInitParameter("notNeedLoginPages") !=null) {
notNeedLoginPages = filterConfig.getInitParameter("notNeedLoginPages");
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uri = request.getRequestURI();
String requestUri = uri.substring(request.getContextPath().length()+1);
System.out.println("sessionFilter中="+requestUri);
String [] pages = notNeedLoginPages.split(",");
boolean isAllow = false;
for(String page:pages) {
if(page.equals("requestUri")) {
isAllow=true;
break;
}
if(requestUri.endsWith(".css") || requestUri.endsWith(".js") ||requestUri.endsWith(".png") || requestUri.endsWith("jpg")) {
isAllow=true;
break;
}
}
if(isAllow) {
filterChain.doFilter(request, response);
System.out.println("放行-----------------");
}else {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("USER");
if(user ==null) {
//没有user就跳到登录页面
System.out.println("跳到登录界面-----------------");
response.sendRedirect(request.getContextPath()+"/login");
}else {
filterChain.doFilter(request, response);
}
}
}
}