【问题标题】:JBoss Login Web Application error - Failed to parse request.: java.lang.IllegalArgumentException: Illegal character in queryJBoss 登录 Web 应用程序错误 - 无法解析请求。:java.lang.IllegalArgumentException:查询中的非法字符
【发布时间】:2024-01-21 22:08:01
【问题描述】:

我正在尝试开发一个登录系统,并且我遵循了 Ticketmonster 的结构。 main.html中的menu容器只有登录后才会填充,内容是登录模板填充的,其中路由器立即渲染登录视图,应用模板。单击登录按钮后,将创建一个 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 错误 = $.parseJSON(error.responseText).errors;

  • 切换Ajax请求的类型,以及服务上的注解 POST,在服务器上没有给出错误,但在 Firebug 中出现以下错误。

POST localhost:8180/MCC2/rest/users 405 方法不允许 8ms jquery-2.0.3.js(第 7845 行) "NetworkError: 405 Method Not Allowed - localhost:8180/MCC2/rest/users"

  • 我在服务的开始处放置了一个断点,总之 在这种情况下,该服务永远不会进入。

更新: 虽然我用 GET 请求写了这篇文章,但我觉得应该是 POST 请求,在这种情况下,问题将是 Firebug 错误的原因。

另外,我在部署应用程序时遇到以下错误: 原因:org.hibernate.MappingException:无法确定类型:java.util.Set,表:用户,列:[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
            + "]";
}

}

【问题讨论】:

    标签: java jquery json rest jboss


    【解决方案1】:

    我认为这行:

    data:JSON.stringify(userLoginRequest)
    

    应该是

    data:encodeURIComponent(JSON.stringify(userLoginRequest))
    

    因为您需要对您在查询字符串中发送的任何数据进行 URL 编码。 JSONification 可能会产生需要在在线发送之前进行编码的字符,如果失败,服务器可能会遇到解析问题,这里就是这种情况。

    【讨论】:

    • 修复了错误,但现在: 1. 我想知道您为什么不需要在 TicketMonster 中使用它? 2. 我现在得到一个不同的错误:WARN [org.jboss.resteasy.core.SynchronousDispatcher] (http-localhost/127.0.0.1:8180-7) Failed execution GET /users: org.jboss.resteasy.spi.ReaderException: java.io.EOFException:由于输入结束,没有要映射到 Object 的内容。我觉得我应该一直使用 POST。更改为 POST 消除了服务器错误,但给了我上面提到的 Firebug 错误。我应该什么时候使用 POST 与 GET 以及 Consumes 与 Produces?
    • 我解决了主要问题。似乎只有 GET 请求才需要转义字符。更改为 POST 会使用 JSON.stringify(userLoginRequest) 以所需格式发送 userLoginRequest。使用 POST,主要问题是 1. Request 类中没有虚拟构造函数。 2.我在更新中提到的部署错误(userListIds)似乎已经产生了影响,所以现在我将所有涉及userListIds的东西都注释掉了,直到我让登录系统正常工作为止。服务断点正在中断,我正在修复一个新错误。我会尽快更新:)
    • 在 GET 与 POST 上,GET 用于获取资源的状态。它是一种幂等操作——它不应该改变资源的状态。因此,多个 GET 不会改变状态,并且可以用于获取最新状态。
    • 在使用 Produces 和 Consumes 时,它们分别表示 HTTP 响应正文或请求正文的内容类型。您可以在注释方法时使用其中之一或两者,具体取决于请求或响应是否具有需要适当解析的主体。这是必要的,因为客户端和服务器都不会假定内容类型是 JSON、XML 或任何其他内容类型。
    最近更新 更多