JBoss 登录 Web 应用程序错误 - 无法解析请求。: java.lang.IllegalArgumentException: 查询中的字符非法
JBoss Login Web Application error - Failed to parse request.: java.lang.IllegalArgumentException: Illegal character in query
我正在尝试开发一个登录系统,我遵循了 Ticketmonster 的结构。 main.html中的menu容器只有登录后才会填充,内容填充登录模板,router立即渲染登录视图,应用模板。单击登录按钮后,将创建一个 Ajax 请求并将其发送到其服务。
- 这是登录视图中的登录函数:
`
login:function(){
var username = $("#username");
var password = $("#password");
var userLoginRequest = {username:username.val(), password:password.val()};
$.ajax({url: (config.baseUrl + "rest/users"),
data:JSON.stringify(userLoginRequest),
type:"GET",
dataType:"json",
contentType:"application/json",
success:function (userId) {
alert(userId);
}}).error(function (error) {
if (error.status == 400 || error.status == 409) {
var errors = $.parseJSON(error.responseText).errors;
_.each(errors, function (errorMessage) {
$("#error").empty().append(errorMessage);
});
} else {
$("#error").empty().append("An error has occurred!");
}
});
}
- 这是服务。更改为 @Consumes 会导致相同的结果。
`
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response authenticateUser(UserLoginRequest userLoginRequest){
User user = serviceUtility.getUserFromUsername(userLoginRequest.getUsername());
if (user == null){
return serviceUtility.badRequestResponse("No users with this username exist!");
} else if (!user.getPassword().equals(userLoginRequest.getPassword())) {
return serviceUtility.badRequestResponse("Incorrect Password!");
} else {
return Response.ok().entity(user.getId()).type(MediaType.APPLICATION_JSON_TYPE).build();
}
}
- 这是服务器错误。经过一些研究,我想可能是
一个转义字符串问题,但我没有看到它适用于 TicketMonster
代码,或在教程中讨论。
WARN [org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher] (http-localhost/127.0.0.1:8180-6) 解析请求失败。:java.lang.IllegalArgumentException:索引 38 处查询中的非法字符:localhost:8180/MCC2/rest/users?{%22username%22:%22wakas%22,%22password%22:%22Password%22}&_=1426754780833
在 java.net.URI.create(URI.java:859) [rt.jar:1.7.0_03]
...
- 这是 Firebug
上的错误
GET localhost:8180/MCC2/rest/users?{%22usernam...2,%22password%22:%22Password%22}&=1426757495550
400 错误请求
19 毫秒
jquery-2.0.3.js(第 7845 行)
"NetworkError: 400 Bad Request - localhost:8180/MCC2/rest/users?{%22username%22:%22User%20Name%22,%22password%22:%22Password%22}&=1426757495550"
用户?{...7495550
SyntaxError: JSON.parse: JSON 数据 login.js 第 1 行第 1 列的意外字符(第 49 行,第 41 栏)
var errors = $.parseJSON(error.responseText).errors;
- 切换Ajax请求的类型,以及服务上的注解
到 POST,在服务器上没有错误,但在 Firebug.
中出现以下错误
POST localhost:8180/MCC2/rest/users
405 方法不允许
8毫秒
jquery-2.0.3.js(第 7845 行)
"NetworkError: 405 Method Not Allowed - localhost:8180/MCC2/rest/users"
- 我在服务的开始处放置了一个断点,并且在所有
情况下,服务永远不会进入。
更新:
虽然我用 GET 请求写了这个 post,但我觉得它应该是一个 POST 请求,在这种情况下,问题就是 Firebug 错误的原因。
此外,我在部署我的应用程序时遇到以下错误:
原因:org.hibernate.MappingException:无法确定类型:java.util.Set,在 table:用户,对于列:[org.hibernate.mapping.Column(userListIds)]
这是用户(不包括 setter 和 getter):
`
@SuppressWarnings("serial")
@Entity
public class User implements Serializable {
@Id
@GeneratedValue
private Long id;
@NotNull
@Size(min = 5, max = 16)
@Pattern(regexp = "[a-zA-Z0-9_]*", message = "Must only contain small and capital letters, numbers, and underscore!")
@Column(unique=true)
private String username;
@NotNull
@Size(min = 5, max = 16)
private String password;
@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String firstName;
@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String lastName;
@NotNull
@Column(unique = true)
@NotEmpty
@Email(message = "Not a valid email format")
private String email;
@Size(min = 10, max = 12)
@Digits(fraction = 0, integer = 12)
private String phoneNumber;
@Size(min = 1, max = 300)
private String description;
// @NotNull <--commented since we don't have a setter
private Date creationDate = new Date();
@NotNull
private Role role = Role.MEMBER;
@NotNull
private boolean enabled = true;
private Set<Long> userListIds = new HashSet<Long>();
public void addUserToUserlist(Long newUserId){
userListIds.add(newUserId);
}
public void removeUserFromUserlist(Long newUserId){
userListIds.remove(newUserId);
}
public Set<Long> getUserListIds() {
return userListIds;
}
public void setUserListIds(Set<Long> userListIds) {
this.userListIds = userListIds;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreationDate() {
return creationDate;
}
// public void setCreationDate(Date creationDate) {
// this.creationDate = creationDate;
// }
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String name) {
this.firstName = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "User [username=" + username + ", firstName=" + firstName
+ ", lastName=" + lastName + ", email=" + email
+ ", phoneNumber=" + phoneNumber + ", creationDate="
+ creationDate + ", role=" + role + ", enabled=" + enabled
+ "]";
}
}
我认为这一行:
data:JSON.stringify(userLoginRequest)
应该是
data:encodeURIComponent(JSON.stringify(userLoginRequest))
因为您需要 URL 对您在查询字符串中发送的任何数据进行编码。 JSONification 可能会产生需要在发送之前进行编码的字符,否则服务器可能 运行 出现解析问题,这里就是这种情况。
我正在尝试开发一个登录系统,我遵循了 Ticketmonster 的结构。 main.html中的menu容器只有登录后才会填充,内容填充登录模板,router立即渲染登录视图,应用模板。单击登录按钮后,将创建一个 Ajax 请求并将其发送到其服务。
- 这是登录视图中的登录函数:
`
login:function(){
var username = $("#username");
var password = $("#password");
var userLoginRequest = {username:username.val(), password:password.val()};
$.ajax({url: (config.baseUrl + "rest/users"),
data:JSON.stringify(userLoginRequest),
type:"GET",
dataType:"json",
contentType:"application/json",
success:function (userId) {
alert(userId);
}}).error(function (error) {
if (error.status == 400 || error.status == 409) {
var errors = $.parseJSON(error.responseText).errors;
_.each(errors, function (errorMessage) {
$("#error").empty().append(errorMessage);
});
} else {
$("#error").empty().append("An error has occurred!");
}
});
}
- 这是服务。更改为 @Consumes 会导致相同的结果。
`
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response authenticateUser(UserLoginRequest userLoginRequest){
User user = serviceUtility.getUserFromUsername(userLoginRequest.getUsername());
if (user == null){
return serviceUtility.badRequestResponse("No users with this username exist!");
} else if (!user.getPassword().equals(userLoginRequest.getPassword())) {
return serviceUtility.badRequestResponse("Incorrect Password!");
} else {
return Response.ok().entity(user.getId()).type(MediaType.APPLICATION_JSON_TYPE).build();
}
}
- 这是服务器错误。经过一些研究,我想可能是 一个转义字符串问题,但我没有看到它适用于 TicketMonster 代码,或在教程中讨论。
WARN [org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher] (http-localhost/127.0.0.1:8180-6) 解析请求失败。:java.lang.IllegalArgumentException:索引 38 处查询中的非法字符:localhost:8180/MCC2/rest/users?{%22username%22:%22wakas%22,%22password%22:%22Password%22}&_=1426754780833 在 java.net.URI.create(URI.java:859) [rt.jar:1.7.0_03] ...
- 这是 Firebug 上的错误
GET localhost:8180/MCC2/rest/users?{%22usernam...2,%22password%22:%22Password%22}&=1426757495550
400 错误请求
19 毫秒
jquery-2.0.3.js(第 7845 行)
"NetworkError: 400 Bad Request - localhost:8180/MCC2/rest/users?{%22username%22:%22User%20Name%22,%22password%22:%22Password%22}&=1426757495550"
用户?{...7495550
SyntaxError: JSON.parse: JSON 数据 login.js 第 1 行第 1 列的意外字符(第 49 行,第 41 栏)
var errors = $.parseJSON(error.responseText).errors;
- 切换Ajax请求的类型,以及服务上的注解 到 POST,在服务器上没有错误,但在 Firebug. 中出现以下错误
POST localhost:8180/MCC2/rest/users 405 方法不允许 8毫秒 jquery-2.0.3.js(第 7845 行) "NetworkError: 405 Method Not Allowed - localhost:8180/MCC2/rest/users"
- 我在服务的开始处放置了一个断点,并且在所有 情况下,服务永远不会进入。
更新: 虽然我用 GET 请求写了这个 post,但我觉得它应该是一个 POST 请求,在这种情况下,问题就是 Firebug 错误的原因。
此外,我在部署我的应用程序时遇到以下错误: 原因:org.hibernate.MappingException:无法确定类型:java.util.Set,在 table:用户,对于列:[org.hibernate.mapping.Column(userListIds)]
这是用户(不包括 setter 和 getter):
`
@SuppressWarnings("serial")
@Entity
public class User implements Serializable {
@Id
@GeneratedValue
private Long id;
@NotNull
@Size(min = 5, max = 16)
@Pattern(regexp = "[a-zA-Z0-9_]*", message = "Must only contain small and capital letters, numbers, and underscore!")
@Column(unique=true)
private String username;
@NotNull
@Size(min = 5, max = 16)
private String password;
@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String firstName;
@NotNull
@Size(min = 1, max = 25)
@Pattern(regexp = "[^0-9]*", message = "Must not contain numbers")
private String lastName;
@NotNull
@Column(unique = true)
@NotEmpty
@Email(message = "Not a valid email format")
private String email;
@Size(min = 10, max = 12)
@Digits(fraction = 0, integer = 12)
private String phoneNumber;
@Size(min = 1, max = 300)
private String description;
// @NotNull <--commented since we don't have a setter
private Date creationDate = new Date();
@NotNull
private Role role = Role.MEMBER;
@NotNull
private boolean enabled = true;
private Set<Long> userListIds = new HashSet<Long>();
public void addUserToUserlist(Long newUserId){
userListIds.add(newUserId);
}
public void removeUserFromUserlist(Long newUserId){
userListIds.remove(newUserId);
}
public Set<Long> getUserListIds() {
return userListIds;
}
public void setUserListIds(Set<Long> userListIds) {
this.userListIds = userListIds;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreationDate() {
return creationDate;
}
// public void setCreationDate(Date creationDate) {
// this.creationDate = creationDate;
// }
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String name) {
this.firstName = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "User [username=" + username + ", firstName=" + firstName
+ ", lastName=" + lastName + ", email=" + email
+ ", phoneNumber=" + phoneNumber + ", creationDate="
+ creationDate + ", role=" + role + ", enabled=" + enabled
+ "]";
}
}
我认为这一行:
data:JSON.stringify(userLoginRequest)
应该是
data:encodeURIComponent(JSON.stringify(userLoginRequest))
因为您需要 URL 对您在查询字符串中发送的任何数据进行编码。 JSONification 可能会产生需要在发送之前进行编码的字符,否则服务器可能 运行 出现解析问题,这里就是这种情况。