① java web登錄後的各種請求在瀏覽器地址不變,過濾器該怎樣攔截每次的請求
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if(req.getSession().getAttribute("user")==null){
req.setAttribute("error", "請你先登錄");
//非法請求才會進到這裡面,在這里保存請求的url地址,在成功登錄後再進行跳轉
req.getSession().setAttribute("goUrl", req.getRequestURL()+"?"+ req.getQueryString());
request.getRequestDispatcher("/ulogin.jsp").forward(request, response);
}
else{
chain.doFilter(request, response);
}
}
上面的代碼是過濾器中的代碼
下面的是servlet中的代碼
if(request.getSession().getAttribute("goUrl")!=null){
String url = (String)request.getSession().getAttribute("goUrl");
response.sendRedirect(url);
}
else{
response.sendRedirect("/webshopping/index.jsp");
}
② 過濾器的url-pattern設置了a.htm,訪問a.htm,不走過濾器
如果你要讓所有訪問頁面請求進過過濾器的話直接<url-pattern>/*.html</url-pattern> 就可以了
③ struts2怎麼在web.xml配置過濾器過濾掉指定的url或者指定的url不過濾
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern> //這個抄 地方指定要過濾的url
</filter-mapping>
④ 急!如何讓過濾器不過濾頁面中引用的CSS或JS頁面
對於這種,我說兩種方法:
1、將你所有的JSP頁面單獨放在一個文件夾里專(假如jspPage),jspPage文件夾里可根據屬類別分若乾子文件夾,再把相對應的JSP放在子文件夾里;
JS、CSS及圖片等分別放在外面的文件夾里(與文件夾jspPage並列)
再:<url-pattern>/jspPage/*</url-pattern>就行了
一般用的就是這種
2、在過濾的JAVA文件中,在doFilter方法里進行判斷,將後綴名為.css、.js等直接設置為通過就行了,這種較為復雜,在一些特殊情況下才用到,一般不推薦
⑤ java過濾器怎麼不過濾一個頁面里包含的多個請求
abstract public class FilterPerRequest implements Filter {
private static final Boolean FILTERED = true;
private ThreadLocal<Boolean> statusLocal = new ThreadLocal<Boolean>();
@Override
final public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
if (hasNotFiltering()) {
doFilterAndDispatchRequest(req, resp, chain);
return;
}
//dispatch request only
chain.doFilter(req, resp);
}
private boolean hasNotFiltering() {
Boolean status = statusLocal.get();
if (status == null) {
return true;
}
return false;
}
private void doFilterAndDispatchRequest(ServletRequest req,
ServletResponse resp, FilterChain chain) throws IOException,
ServletException {
try {
doFilterPerRequest(req, resp);
setFiltered();
chain.doFilter(req, resp);
} finally {
cleanFilterStatus();
}
}
abstract protected void doFilterPerRequest(ServletRequest req,
ServletResponse resp);
private void setFiltered() {
statusLocal.set(FILTERED);
}
private void cleanFilterStatus() {
statusLocal.set(null);
}
}
那要就情況而定了。。。
如果是request范圍內的話,就可以使用上面的過濾器。
如果是session范圍內的話,就需要在session內存儲一個標志變數,方式和request差不多。
如果是限制用戶操作的話,那就必須將用戶操作持久化。
由於你的問題不明確,我也不好多說...
⑥ java過濾器不過濾某個貨某一些路徑
首先在web.xml 配置 參數
<param-name>noLoginPaths</param-name> 參數名可自取
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.imooc.filter.LoginFilter</filter-class>
<init-param>
<param-name>noLoginPaths</param-name>
<param-value>login.jsp;fail.jsp;LoginServlet</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然後在 Filter 中,創建一個FilterConfig 的引用, 這個引用在init中初始化,並且能夠通過它獲取<init-param>中的key和value ,
StringnoLoginPaths=config.getInitParameter("noLoginPaths");
然後通過判斷用戶請求的url 是否符合 noLoginPaths 中設置的不過濾選項,如果如何,就調用do.filter放行
關鍵代碼 :
if(noLoginPaths!=null){
String[]strArray=noLoginPaths.split(";");
for(inti=0;i<strArray.length;i++){
if(strArray[i]==null||"".equals(strArray[i]))continue;
if(request.getRequestURI().indexOf(strArray[i])!=-1){
arg2.doFilter(arg0,arg1);
return;
}
}
}
完整代碼:
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
{
privateFilterConfigconfig;
@Override
publicvoiddestroy(){
}
@Override
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,FilterChainarg2)throwsIOException,ServletException{
HttpServletRequestrequest=(HttpServletRequest)arg0;
HttpServletResponseresponse=(HttpServletResponse)arg1;
HttpSessionsession=request.getSession();
StringnoLoginPaths=config.getInitParameter("noLoginPaths");
Stringcharset=config.getInitParameter("charset");
if(charset==null){
charset="UTF-8";
}
request.setCharacterEncoding(charset);
if(noLoginPaths!=null){
String[]strArray=noLoginPaths.split(";");
for(inti=0;i<strArray.length;i++){
if(strArray[i]==null||"".equals(strArray[i]))continue;
if(request.getRequestURI().indexOf(strArray[i])!=-1){
arg2.doFilter(arg0,arg1);
return;
}
}
}
if(session.getAttribute("username")!=null){
arg2.doFilter(arg0,arg1);
}else{
response.sendRedirect("login.jsp");
}
}
@Override
publicvoidinit(FilterConfigarg0)throwsServletException{
config=arg0;
}
}
⑦ jsp過濾器的web.xml如何指定不想過濾的頁面
在filter類中判斷一下
如果URL是以page/index.jsp結尾的,直接就過了,不做驗證
不過感覺這種方法治標不治本
我也在等達人出現。。。
⑧ 怎麼讓filter不過濾某幾個動作
<filter-mapping
<filter-nameCommonHeadersFilter</filter-name
<url-pattern/*</url-pattern
</filter-mapping/*是對所有的路徑過濾,那麼你可以定義你不過濾的路徑為
<filter-mapping
<filter-nameCommonHeadersFilter</filter-name
<url-pattern/yes/*</url-pattern
</filter-mapping
那麼所有的不包含上面的路徑都不做;
2,如果這個filter是你自己寫的,或者你反編譯後能看懂得話,那麼直接在過濾器裡面自己判斷了!
⑨ filter過濾器配置如何不過濾一些頁面
直接添加多個文件映射啊,為每個需要進行過濾的文件都寫個映射標簽