求助有关页面的跳转 我们在一般论坛点击页面的时候,如果没有登录,就会跳转到其他页面,这是怎么实现的?可以用Struts1的action实现吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在web.xml中进行如下设置<filter> <filter-name>access</filter-name> <filter-class>net.resume.web.AccessFilter</filter-class> <init-param> <param-name>access.config</param-name> <param-value>WEB-INF/access-config.properties</param-value> </init-param> </filter> <filter-mapping> <filter-name>access</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>AccessFilter 类继承了 javax.servlet.Filter,下面是具体实现。。关键是doFilter类,其他的可根据个人习惯及想法实现。import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;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 net.resume.Contants;import net.resume.model.User;import net.resume.service.ServiceException;import net.resume.service.ServiceFactory;import net.resume.service.ServicesConfigException;import net.resume.service.ServicesInstanceExcepption;import net.resume.service.UserServices;public class AccessFilter implements Filter { private Properties config ; public AccessFilter() { super(); // TODO 自动生成构造函数存根 } public void init(FilterConfig cfg) throws ServletException { config = new Properties(); String filename = cfg.getInitParameter("access.config"); filename = cfg.getServletContext().getRealPath(filename); try { config.load(new FileInputStream(filename)); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse)res; String page = parse(request); String roleName = config.getProperty(page); //忽略没有登记授权的页面 if(roleName==null){ chain.doFilter(request, response); return; } //检查是否登陆用户 if(!isLogin(request)){ response.sendRedirect(config.getProperty("login.page")); return; } User user = getLoninUser(request); //验证是否有权限 if(!hasRole(user, roleName)){ response.sendRedirect(config.getProperty("access.error.page")); return; } chain.doFilter(request, response); } private boolean hasRole(User user, String roleKeys){ boolean rv = false; try { ServiceFactory factory = ServiceFactory.getInstance(); UserServices services = factory.getUserService(); String[] roles = roleKeys.trim().split(","); for (int i = 0; i < roles.length; i++) { String roleKey = roles<i>; boolean hasRight = services.checkRole(user,roleKey); if(hasRight){ rv = hasRight; break; } } } catch (ServicesConfigException e) { e.printStackTrace(); } catch (ServicesInstanceExcepption e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } return rv; } private User getLoninUser(HttpServletRequest request){ return (User) request.getSession().getAttribute(Contants.LOGIN_USER); } private boolean isLogin(HttpServletRequest request) { User user = (User) request.getSession().getAttribute(Contants.LOGIN_USER); return user!=null; } private String parse(HttpServletRequest request) { StringBuffer url = request.getRequestURL(); //String page = url.substring(url.indexOf()) StringBuffer page = new StringBuffer(); int count = 0; for(int i = 0; i<url.length(); i++){ char c = url.charAt(i); if(c=='/') count++; if(count>=4) page.append(c); } page.deleteCharAt(0); return page.toString(); } public void destroy() { // TODO 自动生成方法存根 }}楼主可以参考下 一上代码 楼上说的过滤器也可以 也可以用判断 在页面的最上面或者 <head> 标签内调用函数 或获得session session 为空 和不为来判断 .. <%if(session.getAttribute() == null){ //跳转页面的代码}%>不过判断的方法我用的是脚本 不怎么好呢.. 谢谢3楼的兄弟,Struts1里有类似的插件吗? WEB-INF/access-config.properties这里面的内容可以贴出来看看吗? 用这个 上面那个麻烦了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;public class AuthFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {/** 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括* 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过* 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。*/HttpServletRequest request = (HttpServletRequest)servletRequest;/** 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中* 无法得到的方法,就要把此request对象构造成HttpServletRequest*/HttpServletResponse response = (HttpServletResponse)servletResponse;String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:String targetURL = currentURL.substring(currentURL.indexOf("/", 1),currentURL.length()); //截取到当前文件名用于比较HttpSession session = request.getSession(false);if (!"/login.jsp".equals(targetURL)) {//判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环if (session == null || session.getAttribute("user") == null) {//*用户登录以后需手动添加sessionSystem.out.println("request.getContextPath()=" + request.getContextPath());response.sendRedirect(request.getContextPath() + "/login.jsp");//如果session为空表示用户没有登录就重定向到login.jsp页面return;}}//加入filter链继续向下执行filterChain.doFilter(request, response);/** 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作* 为它 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另* 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。*/}public void init(FilterConfig filterConfig) throws ServletException {}} <filter><filter-name>AuthFilter</filter-name><filter- class>com.drp.util.filter.AuthFilter</filter-class></filter><filter- mapping><filter-name>AuthFilter</filter-name><url-pattern>*.jsp</url- pattern>//表示对所有jsp文件有效</filter-mapping> 跟Struts无关,那个类可以直接用,你在web.xml里配置一下就好了。 JavaEE命名规范 求教高手帮忙 MyEclipse里的TomCat插件 数据库连接池 用java做数据导入 b/s结构,一次400万条数据.想做成多线程,大家有什么好的想法吗? java取oracle的clob数据的问题。 超级求救:java.lang.OutOfMemoryError: PermGen space checkbox问题!有数据库 求<<JSP 高级编程>> 帮忙解决BufferedReader的错误! 下载文件可以指定文件名吗? JSP中Request对象读参数的汉字编码问题
<filter-name>access</filter-name>
<filter-class>net.resume.web.AccessFilter</filter-class>
<init-param>
<param-name>access.config</param-name>
<param-value>WEB-INF/access-config.properties</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>access</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
AccessFilter 类继承了 javax.servlet.Filter,下面是具体实现。。
关键是doFilter类,其他的可根据个人习惯及想法实现。import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
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 net.resume.Contants;
import net.resume.model.User;
import net.resume.service.ServiceException;
import net.resume.service.ServiceFactory;
import net.resume.service.ServicesConfigException;
import net.resume.service.ServicesInstanceExcepption;
import net.resume.service.UserServices;public class AccessFilter implements Filter {
private Properties config ; public AccessFilter() {
super();
// TODO 自动生成构造函数存根
} public void init(FilterConfig cfg) throws ServletException {
config = new Properties();
String filename = cfg.getInitParameter("access.config");
filename = cfg.getServletContext().getRealPath(filename);
try {
config.load(new FileInputStream(filename));
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
} } public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse)res;
String page = parse(request);
String roleName = config.getProperty(page);
//忽略没有登记授权的页面
if(roleName==null){
chain.doFilter(request, response);
return;
}
//检查是否登陆用户
if(!isLogin(request)){
response.sendRedirect(config.getProperty("login.page"));
return;
}
User user = getLoninUser(request);
//验证是否有权限
if(!hasRole(user, roleName)){
response.sendRedirect(config.getProperty("access.error.page"));
return;
}
chain.doFilter(request, response);
}
private boolean hasRole(User user, String roleKeys){
boolean rv = false;
try {
ServiceFactory factory = ServiceFactory.getInstance();
UserServices services = factory.getUserService();
String[] roles = roleKeys.trim().split(",");
for (int i = 0; i < roles.length; i++) {
String roleKey = roles<i>;
boolean hasRight = services.checkRole(user,roleKey);
if(hasRight){
rv = hasRight;
break;
}
} } catch (ServicesConfigException e) {
e.printStackTrace();
} catch (ServicesInstanceExcepption e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
return rv;
} private User getLoninUser(HttpServletRequest request){
return (User) request.getSession().getAttribute(Contants.LOGIN_USER);
}
private boolean isLogin(HttpServletRequest request) {
User user = (User) request.getSession().getAttribute(Contants.LOGIN_USER);
return user!=null;
} private String parse(HttpServletRequest request) {
StringBuffer url = request.getRequestURL();
//String page = url.substring(url.indexOf())
StringBuffer page = new StringBuffer();
int count = 0;
for(int i = 0; i<url.length(); i++){
char c = url.charAt(i);
if(c=='/')
count++;
if(count>=4)
page.append(c);
}
page.deleteCharAt(0);
return page.toString();
} public void destroy() {
// TODO 自动生成方法存根 }}楼主可以参考下 一上代码
在页面的最上面或者 <head> 标签内调用函数 或获得session
session 为空 和不为来判断 ..
<%
if(session.getAttribute() == null){
//跳转页面的代码
}
%>
不过判断的方法我用的是脚本 不怎么好呢..
这里面的内容可以贴出来看看吗?
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;public class AuthFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
/** 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
* 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
* 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
*/HttpServletRequest request = (HttpServletRequest)servletRequest;
/** 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
* 无法得到的方法,就要把此request对象构造成HttpServletRequest
*/
HttpServletResponse response = (HttpServletResponse)servletResponse;String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:String targetURL = currentURL.substring(currentURL.indexOf("/", 1),
currentURL.length()); //截取到当前文件名用于比较HttpSession session = request.getSession(false);if (!"/login.jsp".equals(targetURL)) {
//判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
if (session == null || session.getAttribute("user") == null) {
//*用户登录以后需手动添加session
System.out.println("request.getContextPath()=" + request.getContextPath());
response.sendRedirect(request.getContextPath() + "/login.jsp");
//如果session为空表示用户没有登录就重定向到login.jsp页面
return;
}
}
//加入filter链继续向下执行
filterChain.doFilter(request, response);
/** 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作
* 为它 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
* 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
*/
}public void init(FilterConfig filterConfig) throws ServletException {}
} <filter>
<filter-name>AuthFilter</filter-name>
<filter- class>com.drp.util.filter.AuthFilter</filter-class>
</filter>
<filter- mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>*.jsp</url- pattern>//表示对所有jsp文件有效
</filter-mapping>