我在网络应用程序中遇到困难,我发布代码并定义我在代码部分中所做的事情...
这是我的过滤器,用于检查用户类型(管理员、经理、用户)。我在标记的行处收到错误...
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
RequestDispatcher rd=null;
Person user = (Person) session.getAttribute("usertype"); <------ **IM GETTING EXCEPTION HERE!**
if (user != null && user.getType().equals(UserType.MANAGER.toString())) {
String nextJSP = "/ManagerHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else if (user != null && user.getType().equals(UserType.ADMIN.toString())) {
String nextJSP = "/AdminHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else if (user != null && user.getType().equals(UserType.USER.toString())) {
String nextJSP = "/UserHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else {
String nextJSP = "/Login.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
chain.doFilter(request, response);
}
这是我的 Person 类,其中包含人员记录
@Table(name="\"Person\"")
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 2532993385565282772L;
@Id
@Column(name="id",nullable=false,updatable=false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String name;
private String surname;
private String sskno;
private String address;
private String telno;
private String type;
@OneToMany
private List<Leave> leaves;
public Person() {
}
getters & setters....
这是我的LoginServlet...这里暂时Pusername、Pname、Pusertype 和Pusername 用于设置 session 属性。根据此页面,JSP 的定向取决于用户类型...(如果用户转到 userhome,如果经理经理回家并继续)...我知道为什么我会收到此错误,但我不知道如何避免它。我做了研究,但没有任何效果...请帮助我,这是我的 Loginservlet
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
String pName;
String pSurname;
String pUserName;
String pUserType;
String query;
String home="/Login.jsp";
String username = request.getParameter("username");
String password = request.getParameter("password");
RequestDispatcher rd = request.getRequestDispatcher(home);
mysqlCon con = new mysqlCon();
//HttpSession session = request.getSession();
LoginService ls = new LoginService();
Statement stmt = con.getConnection().createStatement();
query = "SELECT name, surname, usertype, username FROM employee WHERE username='"
+ username + "' AND password='" + password + "';";
stmt.executeQuery(query);
ResultSet rs = stmt.getResultSet();
if(rs.next()){
pName = rs.getString(1);
pSurname = rs.getString(2);
pUserType = rs.getString(3);
pUserName = rs.getString(4);
if (ls.loginCheck(username, password) != false) {
Person tmp = new Person();
tmp.setName(pName);
tmp.setSurname(pSurname);
tmp.setType(pUserType);
tmp.setUsername(pUserName);
HttpSession session = request.getSession();
session.setAttribute("name", tmp.getName());
session.setAttribute("surname", tmp.getSurname());
session.setAttribute("usertype", tmp.getType());
session.setAttribute("username", tmp.getUsername());
if (pUserType.equals(UserType.MANAGER.toString())) {
String nextJSP = "home/ManagerHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else if (pUserType.equals(UserType.ADMIN.toString())) {
String nextJSP = "home/AdminHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else if (pUserType.equals(UserType.USER.toString())) {
String nextJSP = "home/UserHome.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
else {
String nextJSP = "/Login.jsp";
rd = request.getRequestDispatcher(nextJSP);
rd.forward(request, response);
}
}
}
else {
rd.forward(request, response);
}
如果您想让我添加更多信息,我可以做到。我的问题是我怎样才能避免这种情况并使其发挥作用。
最佳答案
tmp
是 Person
类型的对象。据推测,.getType()
会获取 Person
类的 String type;
属性。因此,您实际上是在此处设置一个 String
对象:
session.setAttribute("usertype", tmp.getType());
因此下面的行结果为 ClassCastException
:
Person user = (Person) session.getAttribute("usertype");
您需要将返回值转换为 String
。
String userType = (String) session.getAttribute("usertype");
<小时/>
更好的是,您可以在 session
中设置整个 Person
对象。
HttpSession session = request.getSession();
session.setAttribute("person", tmp);
然后您可以检索其属性:
Person user = (Person) session.getAttribute("person");
String personType = user.getType();
......................
关于java - 过滤器中的 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309148/