public class ForceNoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) res;
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setDateHeader("Expires", -1);
chain.doFilter(req, res);
}
@Override public void init(FilterConfig cfg) {}
@Override public void destroy() {}
}
web.xml:
<filter>
<filter-name>noCache</filter-name>
<filter-class>com.yourpkg.ForceNoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>noCache</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class CheckLoginFilter implements Filter {
private String redirectURL; // 登入頁 (不含 contextPath)
private String sessionKey; // Session 屬性名
private Set<String> excludeUrls = new HashSet<>(); // 不攔截路徑
@Override
public void init(FilterConfig cfg) {
redirectURL = cfg.getInitParameter("redirectURL");
sessionKey = cfg.getInitParameter("checkSessionKey");
String list = cfg.getInitParameter("notCheckURLList");
if (list != null) {
for (String s : list.split(";")) excludeUrls.add(s.trim());
}
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String uri = request.getServletPath() +
(request.getPathInfo() == null ? "" : request.getPathInfo());
if (excludeUrls.contains(uri)) {
chain.doFilter(req, res);
return;
}
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute(sessionKey) == null) {
response.sendRedirect(request.getContextPath() + redirectURL);
return;
}
chain.doFilter(req, res);
}
@Override public void destroy() { excludeUrls.clear(); }
}
web.xml 配置範例:
<filter>
<filter-name>loginCheck</filter-name>
<filter-class>com.yourpkg.CheckLoginFilter</filter-class>
<init-param><param-name>redirectURL</param-name><param-value>/login.jsp</param-value></init-param>
<init-param><param-name>checkSessionKey</param-name><param-value>USER_INFO</param-value></init-param>
<init-param><param-name>notCheckURLList</param-name><param-value>/login.jsp;/static/;/error.jsp</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>loginCheck</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig cfg) {
encoding = cfg.getInitParameter("encoding");
if (encoding == null) encoding = "UTF-8";
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
if (encoding != null) {
req.setCharacterEncoding(encoding); // 必須在讀取參數前呼叫
}
chain.doFilter(req, res);
}
@Override public void destroy() {}
}
web.xml:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.yourpkg.CharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml 中 <filter-mapping> 宣告順序決定執行鏈順序。建議順序:
CharacterEncodingFilter (最早設定編碼)ForceNoCacheFilterCheckLoginFilter (需讀取 Session)@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() {
FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CharacterEncodingFilter());
bean.addUrlPatterns("/*");
bean.setOrder(1);
return bean;
}
// 其他 Filter 同理...
}
這三個 Filter 涵蓋 Web 應用最基礎的橫切關注:快取控制、安全攔截、字元編碼。掌握 Filter 鏈機制與初始化參數配置,即可快速建構可維護的攔截體系。