filter-mapping(怎么为filter-mapping中的#设置例外)
大家好,今天我将向大家分享有关filter-mapping和怎么为filter-mapping中的/*设置例外的一些独特见解,希望能够为你们带来新的思考和启示。
怎么为filter-mapping中的/*设置例外
在web.xml声明的一个filter中:
<!– session过滤filter–>
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>
com.iqbon.jcms.web.util.SessionFilter
</filter-class>
<init-param>
<param-name>excludedPages</param-name>
<param-value>/admin/login.do</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
可以看到url-pattern的设置里面过滤的url规则是/admin/*,如果要把/admin/login.do排除在过滤url之外。
可以结合init-param的初始化参数和HttpServletRequest的getServletPath()方法来判断。
首先加上初始化参数:
<init-param>
<param-name>excludedPages</param-name>
<param-value>/admin/login.do</param-value>
</init-param>
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 org.apache.commons.lang3.StringUtils;
import com.iqbon.jcms.util.KeyConstant;
/**
* session过滤器
*/
public class SessionFilter implements Filter{
/**
*需要排除的页面
*/
private String excludedPages;
private String[] excludedPageArray;
/**
*@see Filter#destroy()
*/
public void destroy(){
return;
}
/**
*对session进行判断当前访问是否有登录
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
boolean isExcludedPage= false;
for(String page: excludedPageArray){//判断是否在过滤url之外
if(((HttpServletRequest) request).getServletPath().equals(page)){
isExcludedPage= true;
break;
}
}
if(isExcludedPage){//在过滤url之外
chain.doFilter(request, response);
} else{//不在过滤url之外,判断session是否存在
HttpSession session=((HttpServletRequest) request).getSession();
if(session== null|| session.getAttribute(KeyConstant.SESSION_KEY_USER)== null){
((HttpServletResponse) response).sendRedirect(“/login.htm”);
} else{
chain.doFilter(request, response);
}
}
}
/**
*初始化函数,获取需要排除在外的url
*/
public void init(FilterConfig fConfig) throws ServletException{
excludedPages= fConfig.getInitParameter(“excludedPages”);
if(StringUtils.isNotEmpty(excludedPages)){
excludedPageArray= excludedPages.split(“,”);
}
return;
}
}
filter-mapping元素的简介
filter-mapping元素用来声明Web应用中的过滤器映射。过滤器可被映射到一个servlet或一个URL模式。将过滤器映射到一个servlet中会造成过滤器作用于servlet上。将过滤器映射到一个URL模式中则可以将过滤器应用于任何资源,只要该资源的URL与URL模式匹配。过滤是按照部署描述符的filter-mapping元素出现的顺序执行的。
web.xml lt;filter-mapping>我不想过滤html文件,怎么设置
不使用/*拦截所有,拦截想拦截的就可以了
类似下面的过滤方式
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.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>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.usl</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.view</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/jaxrs/*</url-pattern>
</filter-mapping>
在filter类中判断一下,如果是.html结尾的就不过滤。
HttpServletRequest req=(HttpServletRequest)request;
//由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".html")) chain.doFilter(request, response);
HttpServletRequest req=(HttpServletRequest)request;
//由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".html")) chain.doFilter(request, response);
chain是以下过滤方法中的chain吗?
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException{
另外, if(reqURI.endsWith(".html"))到底是真还是假
HttpServletRequest req=(HttpServletRequest)request;
//由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".html")) chain.doFilter(request, response);
chain是以下过滤方法中的chain吗?
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException{
另外, if(reqURI.endsWith(".html"))到底是真还是假
就是这个chain,这个判断就是判断你放问的路径是否以.html结尾,你可以试试。
HttpServletRequest req=(HttpServletRequest)request;
//由于web.xml中设置Filter过滤全部请求,可以排除不需要过滤的url
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".html")) chain.doFilter(request, response);
chain是以下过滤方法中的chain吗?
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException{
另外, if(reqURI.endsWith(".html"))到底是真还是假
就是这个chain,这个判断就是判断你放问的路径是否以.html结尾,你可以试试。
报错
java.lang.IllegalStateException: getWriter() has already been called for this response
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{
//把ServletRequest和ServletResponse转换成真正的类型
HttpServletRequest req=(HttpServletRequest)request;
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".do")) chain.doFilter(request, response);
System.out.println(reqURI);
chain.doFilter(request, response);
}
我这里用过的原代码,没错,你看下你别的地方,用到response的地方
//把ServletRequest转换成真正的类型
HttpServletRequest req=(HttpServletRequest)request;
String reqURI= req.getRequestURI();
if(reqURI.endsWith(".html")) chain.doFilter(request, response);
else{
return;
}
filter-mapping的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于怎么为filter-mapping中的/*设置例外、filter-mapping的信息别忘了在本站进行查找哦。